我不明白为什么会这样:
void main() {
int * b;
b = (int *)malloc(sizeof(int));
*b = 1;
printf("*b = %dn", *b);
}
而这没有(获得malloc()
的分段错误):
void main() {
int ** a;
int i;
for (i = 0; i<= 3; i++) {
a[i] = (int*)malloc(sizeof(int));
*(a[i]) = i;
printf("*a[%d] = %dn", i, *(a[i]));
}
}
因为我发现a[i]
就像第一个例子中的b
。
BTW, a[i]
= *(a+i)
,对吗?
您需要首先为a
分配内存,以便您可以访问a[i]
的成员。
所以如果你想分配4个int *
,请执行
a = malloc(sizeof(int *) * 4);
for (i = 0; i<= 3; i++) {
...
}
或者定义为整型指针数组
int *a[4];
a是一个二维指针,你必须分配两个维度。B是一个一维指针,你只需要分配一维空间
就是这样做的b = (int *)malloc(sizeof(int));
那么为了使第二个例子有效你必须为指针的指针分配空间
void main() {
int ** a;
int i;
a = (int**)malloc(4*sizeof(int*));
for (i = 0; i<= 3; i++) {
a[i] = (int*)malloc(sizeof(int));
*(a[i]) = i;
printf("*a[%d] = %dn", i, *(a[i]));
}
分配的指针被写入未初始化的内存(您从未将a
设置为任何值),导致未定义的行为。
所以不,它完全不等同于第一个例子中的代码。
你需要这样写:
int **a;
a = malloc(3 * sizeof *a);
首先,要确保a
持有有效的东西,然后你可以使用索引并分配给a[0]
。
进一步:
a[i] = (int*)malloc(sizeof(int));
没有任何意义。它赋值给a[i]
,一个类型为int *
的对象,但是为sizeof (int)
分配空间。
最后,不要在c中强制转换malloc()
的返回值。
实际上malloc如果你真的想要安全和可移植,在Linux上,malloc可以为给定的请求返回一个积极的响应,即使实际的内存甚至不是真正为你的程序保留的,或者内存是不可写的。
据我所知,你的两个例子都可能返回一个段错误或简单的崩溃。
我认为malloc是真正的可移植和"安全"的原因。