[英]“Real” Array pointer and malloc
所以我只是在玩数组指针来看看它们是如何工作的,我下面的示例为 2 个数组指针分配空间,指向一个 10 个整数的数组。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int (*p)[10] = malloc(sizeof(int[10]) * 2);
for (int arrayI = 0; arrayI < 2; ++arrayI) {
for (int i = 0; i < 10; ++i) {
p[arrayI][i] = (arrayI+1) * i;
}
}
for (int arrayI = 0; arrayI < 2; ++arrayI) {
for (int i = 0; i < 10; ++i) {
printf("%d\n", p[arrayI][i]);
}
printf("\n");
}
}
这似乎工作正常并给了我:
C:\Users\USERNAME\Desktop>gcc -Wall -Wextra --std=c18 a.c && a.exe
0
1
2
3
4
5
6
7
8
9
0
2
4
6
8
10
12
14
16
18
对于我的问题,你很少看到这样的代码,如果有的话。 做这样的事情有什么危险还是只是“糟糕的代码”。 再说一次,这只是我在玩数组指针。
做这样的事情有什么危险还是只是“糟糕的代码”。
不,这实际上是制作动态分配的二维数组的正确方法。
代替
int (*p)[10] = malloc(sizeof(int[10]) * 2);
我更喜欢
int (*p)[10] = malloc(2 * sizeof *p);
因为p
是一个指向 10 个整数数组的指针,所以*p
是一个 10 个整数数组。
许多人更喜欢明确发布 memory。 这不是必需的,因为程序无论如何都会终止。 这是基于意见的,但我会补充:
free(p);
return 0;
在程序结束时。
我下面的示例为 2 个数组指针分配空间,这些指针指向一个具有 10 个整数的数组
不,这是一个数组指针int (*p)[10]
。 这给出了 2 arrays: sizeof(int[10]) * 2
。
做这样的事情有什么危险吗
唯一的危险是晦涩的取消引用语法。 编写示例的最正确方法是:
int (*p)[2][10] = malloc(sizeof(int[2][10]));
或同等学历
int (*p)[2][10] = malloc(sizeof *p);
但是如果你这样做,你必须在取消引用时写出看起来很奇怪的(*p)[i][j]
。 因此,我们删除最左边的维度,即“手动数组衰减”,并得到一个int (*)[10]
,它实际上是指向int[2][10]
数组中第一个元素的指针。 如果需要,您还可以将代码重写为:
int (*arr)[2][10] = malloc(sizeof *arr);
int (*p)[10] = *arr;
此外,您应该始终free
已分配的 memory,因为如果您在程序中的某个地方有任何潜伏的指针损坏错误, free
通常会导致崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.