【发布时间】:2012-01-06 18:01:29
【问题描述】:
这个问题是Malloc call crashing, but works elsewhere的延续
我尝试了以下程序,发现它可以正常工作(即没有崩溃 - 上面提到的链接中也提到了这一点)。我可能很幸运能够让它工作,但我正在寻找 SO 专家的合理解释,说明为什么它有效?!
这里是使用malloc() w.r.t structures和pointers分配memory的一些基本理解
-
malloc(sizeof(struct a) * n)分配n类型的数量struct a元素。并且,可以使用pointer-to-type-"struct a"存储和访问此内存位置。基本上是struct a *。 -
malloc(sizeof(struct a *) * n)分配n类型的数量struct a *元素。然后每个元素都可以指向struct a类型的元素。基本上malloc(sizeof(struct a *) * n)分配一个array(n-elements)-of-pointers-to-type-"struct a"。而且,分配的内存位置可以使用pointer-to-(pointer-to-"struct a")进行存储和访问。基本上是struct a **。
所以当我们创建array(n-elements)-of-pointers-to-type-"struct a"时,是不是
- 将其分配给
struct a *而不是struct a **是否有效? - 使用
pointer-to-"struct a"访问/取消引用分配的array(n-elements)-of-pointers-to-type-"struct a"有效吗?
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
sn-p代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
typedef struct {
int value1;
int value2;
}data;
int n = 1000;
int i;
int val=0;
data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
printf("allocation successful\n");
for (i=0 ; i<n ; i++) {
array[i].value1 = val++;
array[i].value2 = val++;
}
for (i=0 ; i<n ; i++) {
printf("%3d %3d %3d\n", i, array[i].value1, array[i].value2);
}
free(array);
printf("freeing successful\n");
return 0;
}
编辑: 好的,如果我按照 错误
执行以下操作data * array = NULL;
if ((array = (data *)malloc(sizeof(data *) * n)) == NULL) {
有没有办法捕获(在编译时使用任何GCC 标志)这些意外的编程错字有时可能会起作用并且可能随时爆发!我使用-Wall 编译了它,但没有发现任何警告!
【问题讨论】:
-
您的问题标题似乎与您上面其余文本中的实际问题不符...
-
另外,为什么要将
malloc的结果分配给错误的东西,然后取消引用呢?我不明白问题的前提。 -
@OliCharlesworth 我这样做是错误的,不是故意的!所以当我这样做时程序不会崩溃吗?!
-
关于编辑:不要写
array = malloc(sizeof(data) * n)。而是写array = malloc(sizeof(*array) * n);。它对编译器没有任何帮助,但它可以帮助您分配正确的类型,因为您不必命名类型,您只需要记住在您分配的指针名称之前放置*.我认为 GCC 中没有任何东西可以强制执行此操作,但是如果您环顾四周,您可能会发现一个 lint 样式工具,该工具将围绕使用malloc执行样式规则。 -
@SangeethSaravanaraj 你的代码不正确它正在工作,因为 val 变量太小,如果它更大它会失败