一个指向不同大小的整数数组的 N 指针数组......(注意不要在 C 中强制转换 malloc 返回值 - 可以隐藏错误 - 请参阅是否强制转换malloc 的结果?)。
int i = 0;
int *p[N];
size_t sizes[] = { 4, 3, ..., 5 }; // N sizes
for(; i < N; ++i)
{
p[i] = malloc(sizeof(int) * sizes[i]);
}
现在p
是一个指向 int 的指针数组。p[n]
因此是数组中的第 n 个指向 int 的指针。
int *p[n]
在内存中看起来像这样:
int *p[n]
+-----+
| | <------- Each element of the array is a pointer-to-an-integer
| |
+-----+
| |
| |
+-----+
.
.
.
+-----+
| |
| |
+-----+
当我们这样做时p[n] = malloc(sizeof(int) * sizes[i])
,我们说的是指针p[n]
(记住数组的每个元素p
都是一个指针),指向一个sizes[i]
整数大小的内存块。所以你会得到类似...
+-----+ +------+------+ ... +------+
|p[n] |-------- array element is a pointer to ---> | int1 | int2 | | intm |
| | | | | | |
+-----+ +------+------+ ... +------+
.
.
.
+-----+
| |
| |
+-----+
因此,当您编写时,p[n]
您正在访问指向您malloc()
编辑的整数数组的指针......
稍后在您的代码中,您必须记住free()
分配的内存:)
for(; i < N; ++i)
{
free(p[i]);
}
希望这可以帮助...
编辑:没有阅读你问题的最后一点,但 wilsonmichaelpatrick 已经回答了......
编辑:注意,顺便说一句,我没有检查malloc()
返回NULL
和处理可能的错误,这只是一个例子......
如果您不想int *p[N];
在堆栈上声明并且更喜欢堆,请尝试以下...
int i = 0;
size_t sizes[] = { 4, 3, ..., 5 }; // N sizes
int **p = malloc(sizeof(int *) * N);
for(; i < N; ++i)
{
p[i] = malloc( sizeof(int) * sizes[i]);
}
...
...
for(; i < N; ++i)
{
free(p[i]);
}
free(p);
编辑:#include <stdlib.h>
用于定义free()
和malloc()