我有以下C代码:
int dimension;
double *AtS;
...
AtS=(double*)malloc(sizeof(double)*dimension);
for (i=0; i<dimension; i++)
{
AtS[i]=0.0;
}
虽然dimension
约为6-8百万,但它工作正常,但当它大约有3亿时,它会因访问冲突而失败。调试中的以下消息:
mathpro.exe中0x012f1077处的未处理异常:0xC0000005:访问冲突写入位置0x00000000。
如果我使用memset()
而不是循环,则情况相同。
有什么想法可以解决这个问题吗?
答案 0 :(得分:3)
手册
解释了“访问冲突写入位置0x00000000”http://man7.org/linux/man-pages/man3/malloc.3.html#RETURN_VALUE
出错时,这些函数返回NULL。
或者如果您更喜欢http://www.cplusplus.com/reference/cstdlib/malloc/。
返回值
成功时,指向由...分配的内存块的指针 功能。此指针的类型始终为void *,可以是 转换为所需类型的数据指针以便 提领。 如果函数未能分配请求的 内存块,返回空指针。
您遇到了错误。很可能是内存不足。
如果你在将值sizeof(double)*dimension
传递给malloc之前检查它,你会发现它确实是一个很大的数字。
答案 1 :(得分:2)
正如Captain Giraffe中answer先生已经解释过的那样,你面临的问题是因为malloc()
的内存分配失败了(非常可能非常大< / em>分配请求)并且在使用返回的指针之前没有检查malloc()
是否成功。
如果失败。 malloc()
将返回NULL
,如果不进行检查,您将取消引用NULL
指针,该指针又会调用undefined behaviour。
除此之外,我想补充三点,例如
请malloc()
C
和loop
中的家人返回do not cast。
您无需使用0
将(正确)分配的内存初始化为malloc()
。相反,要以有效的方式完成此操作,请使用
健壮在表达式中使用AtS=malloc(dimension * sizeof*AtS); //sizeof is an operator
的方法是将表达式写为
AtS
独立于AtS
的类型。稍后,如果更改{{1}}的类型,则根本不需要修改此表达式。