尝试填充动态数组(大量项目)时访问冲突

时间:2015-06-15 15:52:58

标签: c arrays pointers malloc dynamic-memory-allocation

我有以下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()而不是循环,则情况相同。

有什么想法可以解决这个问题吗?

2 个答案:

答案 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 Giraffeanswer先生已经解释过的那样,你面临的问题是因为malloc()的内存分配失败了(非常可能非常大< / em>分配请求)并且在使用返回的指针之前没有检查malloc()是否成功。

如果失败。 malloc()将返回NULL,如果不进行检查,您将取消引用NULL指针,该指针又会调用undefined behaviour

除此之外,我想补充三点,例如

  1. malloc() Cloop中的家人返回do not cast

  2. 您无需使用0将(正确)分配的内存初始化为malloc()。相反,要以有效的方式完成此操作,请使用

    • 你可以使用calloc(),它返回 内存设置为零。
    • 您可以使用memset()然后memset()将分配的内存设置为malloc()提供的特定值。
  3. 健壮在表达式中使用AtS=malloc(dimension * sizeof*AtS); //sizeof is an operator 的方法是将表达式写为

    AtS

    独立于AtS类型。稍后,如果更改{{1}}的类型,则根本不需要修改此表达式。