获取用户存储segfault错误

Getting User store segfault error

本文关键字:错误 segfault 存储 用户 获取      更新时间:2023-10-16

我收到一个大型卷积运算的错误"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或更高的数组大小,我会得到segfault错误。

知道为什么会发生这种事吗?我该如何纠正?

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

↑看起来有点自相矛盾。

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

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

顺便说一句,我会放弃像前缀一样的匈牙利符号。例如,t_读起来就像这是一种类型。匈牙利表示法的时代是20世纪80年代末,其目的是支持微软的程序员工作台,这是一个现在已经停产(很长时间)的产品。

您可能为堆栈声明了太大的数组。每个8字节的216元素相当多(512K字节)。

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

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

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

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