获取用户存储段错误

时间:2013-12-10 06:27:49

标签: c++ segmentation-fault

我收到错误“User store segfault @ 0x000000007feff598”以进行大型卷积操作。 我已将结果数组定义为

        int t3_isize = 0;
        int t3_irowcount = 0;
        t3_irowcount=atoi(argv[2]);
        t3_isize = atoi(argv[3]);
        int iarray_size = t3_isize*t3_irowcount;

        uint64_t t_result[iarray_size];

我注意到如果数组大小小于2^16 - 1,则操作不会失败,但对于数组大小2^16或更高,我会收到段错误。

知道为什么会这样吗?我怎么能纠正这个?

3 个答案:

答案 0 :(得分:0)

  

“我注意到如果数组大小大于2 ^ 16 - 1,则操作不会失败,但对于数组大小为2 ^ 16或更高,我会得到段错误”

↑似乎有点自相矛盾。

但可能你只是在堆栈上分配一个太大的数组。使用动态内存分配(例如,只需切换到使用 std::vector )即可避免此问题。例如:

std::vector<uint64_t> t_result(iarray_size);

顺便说一句,我会抛弃匈牙利符号式的前缀。例如,t_读取这样的类型。匈牙利表示法的时间是1980年代后期,它的目的是支持微软的Programmer's Workbench,这是一种现在已经完成的(非常长的)产品。

答案 1 :(得分:0)

你可能会为堆栈声明一个太大的数组。每个8字节的2个 16 元素相当多(512K字节)。

如果您只需要静态分配,请将数组移动到文件范围。

否则,请考虑使用std::vector,它将从堆中分配存储并为您管理。

答案 2 :(得分:0)

使用malloc()解决了这个问题。

            uint64_t* t_result = (uint64_t*) malloc(sizeof(uint64_t)*iarray_size);