C 数组 malloc() VS

Posted

技术标签:

【中文标题】C 数组 malloc() VS【英文标题】:C array malloc() VS 【发布时间】:2012-11-18 19:16:14 【问题描述】:

我知道结果

int *x = malloc(sizeof(int)*100);

int x[100];

一样,但是第一个分配堆内存,第二个分配堆栈内存。

现在我需要创建一个巨大的数组(大约 10000 个元素,不在一个模式中),我认为 malloc() 更合适。

但是当我准备初始化数组时,我遇到了一个问题。 我不能使用任何循环来初始化数组,如何初始化使用 malloc 创建的数组,就像使用

int x[100] = 1,2,3,4,......,6,7,5;

【问题讨论】:

你不能循环初始化你的动态数组,因为......? 我不能使用任何循环来初始化数组 - 为什么不呢? *** 经验法则 #3 生效:“如果 OP 说‘我知道’,他们不会。” x[0]=0; x[1]=1; x[2]=2;... 看,没有循环! int *x = malloc(sizeof(int)*100);int x[100]; 不一样,不仅仅是因为堆栈和堆。 【参考方案1】:

当您说int a[] = 1, 2, 3 ; 时,您正在使用初始化程序 为数组a 提供初始数据(并推断其大小)。这是 C 语法的一部分。

当您说int * p = malloc(1000); 时,您只是在进行库调用并存储一个指针。语言或库中没有机制为这个指针指向的内存提供初始值,也不需要指针指向任何东西(可能是NULL)。

你应该注意到数组不是指针,指针也不是数组。 ap 是完全不同的动物,尽管你可以说 p[1] = a[1];

【讨论】:

是否存在不能像 b 一样对待 a 的情况?这与 free() 和 realloc() 之类的函数不同,或者将指针传递给 a 可能是不安全的。 @Paul:当然:int n; p = &n; 有效,但a = &n; 无效。数组衰减会产生“右值”(如果有意义的话)。此外,&p 的类型为 int**,而 &a 的类型为 (int*)[3]【参考方案2】:

如果您无法使用循环初始化数组,您可以使用memset() 并摆脱它。

【讨论】:

【参考方案3】:

如果数据没有变化,最好的办法就是写

static const int x [100] =  23, 12, 5, 7, ... ;

没有代码。初始化不需要时间。我实际上已经看到了以这种方式初始化数兆字节数据的代码,没有任何问题。

【讨论】:

以上是关于C 数组 malloc() VS的主要内容,如果未能解决你的问题,请参考以下文章

C语言里,啥时候用数组啥时候用指针和动态内存(malloc/calloc)?

C 中的 malloc,但使用多维数组语法

malloc动态创建二维数组(C语言)

C语言复习之malloc和realloc(为字符串数组分配内存)

剖析C动态内存管理 (malloc,calloc,realloc,柔性数组)

没有malloc的C中的动态数组?