首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试填充动态数组时的访问冲突(大量项)

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

Stack Overflow用户
提问于 2015-06-15 15:52:57
回答 2查看 359关注 0票数 1

我有以下C代码:

代码语言:javascript
复制
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()而不是循环,情况也是一样的。

有什么办法解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-15 15:56:04

“访问冲突写入位置0x00000000”由手册解释。

价值

如果出现错误,这些函数返回NULL。

或者你是否喜欢http://www.cplusplus.com/reference/cstdlib/malloc/

返回值 成功时,指向由函数分配的内存块的指针。此指针的类型始终为void*,可以将其转换为所需类型的数据指针,以便解除引用。如果函数未能分配请求的内存块,则返回一个空指针.。

您遇到了一个错误。很可能是因为记忆不足。

如果您在将值sizeof(double)*dimension传递给malloc之前检查它,您会发现它确实是一个相当大的数字。

票数 3
EN

Stack Overflow用户

发布于 2015-06-15 16:27:54

正如长颈鹿船长先生在回答中已经解释过的,您正面临这个问题,因为通过malloc()进行的内存分配已经失败(很可能对于非常大的分配请求),并且在使用返回的指针之前没有检查malloc()的成功与否。

万一失败。malloc()将返回NULL,如果不进行检查,您将取消引用NULL指针,这反过来会调用未定义行为

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

  1. 不要铸造 malloc()和家庭在C中的返回值。
  2. 您不需要使用loop来初始化(正确)分配给0的内存。相反,要以有效的方式完成这一任务,请使用以下两种方法
代码语言:javascript
复制
- you can use [`calloc()`](http://linux.die.net/man/3/calloc), which returns the  memory set to zero.
- you can use `malloc()` and then [`memset()`](http://linux.die.net/man/3/memset) to set the allocated memory to the particular value supplied with `memset()`.

  1. 在表达式中使用malloc()的健壮方法是将表达式编写为 AtS=malloc(维度* sizeof*AtS);//sizeof是一个运算符。 它独立于AtS的类型。稍后,如果更改了AtS的类型,则根本不需要修改该表达式。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30849601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档