c - 前 6 次迭代后出现段错误

标签 c

我正在尝试测量以纳秒为单位的平均访问延迟,但在第一次迭代后我收到“段错误(核心转储)”。我错过了什么吗?我是否滥用了指针。 这是导致错误的函数:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#include <inttypes.h>

inline uint64_t as_nanoseconds(struct timespec* ts)
{
    return ts->tv_sec * (uint64_t)1000000000L + ts->tv_nsec;
}

double measure(size_t sizes, uint32_t distance, size_t num_iter, size_t num_rep) 
{
    uint32_t *array;
    array = malloc(sizes * sizeof(uint32_t));

    int x = sizes / distance;

    uint32_t *array_2;
    array_2 = malloc(x * sizeof(uint32_t));

    for (uint32_t i = 0; i < x; i++) {
        array_2[i] = i;
    }

    for (size_t i = 0; i < sizes; i++) {
        array[i] = 0;
    }

    for (size_t i = 0; i < x - 1; i++) {
        array[array_2[i] * distance] = array_2[i + 1] * distance;
    }

    array[array_2[x - 1] * distance] = array_2[0] * distance;

    double *measurements;
    measurements = malloc(num_rep * sizeof(uint32_t));

    uint64_t accu_nsec = 0;
    struct timespec start;
    struct timespec stop;

    for (size_t run = 0; run < num_rep; ++run) {

        volatile uint32_t next_offset = 0;

        clock_gettime(CLOCK_REALTIME, &start);

        for (size_t i = 0; i < num_iter / 1000; ++i) {
            for (int x = 0; x < 1000; x++)
                next_offset = array[next_offset];
        }

        clock_gettime(CLOCK_REALTIME, &stop);

        accu_nsec += as_nanoseconds(&stop) - as_nanoseconds(&start);
        double latency_per_access = (double)accu_nsec / num_iter;
        measurements[run] = latency_per_access;
    }

    double AVG_LPA;

    for (int i = 0; i < num_rep; i++)
        AVG_LPA = +measurements[i];

    return AVG_LPA / num_rep;
}

最佳答案

这里:

double *measurements;
measurements = malloc(num_rep * sizeof(uint32_t));

应该是

double *measurements;
measurements = malloc(num_rep * sizeof(double));

我也怀疑这个

double AVG_LPA;

for (int i = 0; i < num_rep; i++)
    AVG_LPA = +measurements[i];

没有按照你的想法去做。也许

double AVG_LPA = 0.0;

for (int i = 0; i < num_rep; i++)
    AVG_LPA += measurements[i];

关于c - 前 6 次迭代后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50204536/

相关文章:

c - strcpy 和 strcmp 以及 printf 和 scanf 的参数出错

c - GNU ARM 嵌入式工具链安装问题

c - 在链接列表中存储字符串时遇到问题

c - 如何通过防火墙沙箱和分析流量

python - 将 Linux 内核 add_key 和 keyctl 系统调用与组 key 环一起使用

比较字符数组以检查输入是否相同

c++ - Lua 从 C 函数返回自定义数据

c - 对数学函数的复平面​​进行基准测试和检查的值是什么?

c - LoRaWAN OTAA协议(protocol)规范

c - 有没有办法防止编译器搞乱内联汇编