我收到错误“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
或更高,我会收到段错误。
知道为什么会这样吗?我怎么能纠正这个?
答案 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);