在理解输出时,我应该考虑什么?因为现在我的输出是 20 个整数的垃圾,我不知道为什么。我的目标是创建 20 个数组,每个数组包含 30 个整数。因此,最终数组将具有 19 到 48 的整数。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int **p;//Declaration of a pointer variable
int i = 0, j;
int rows = 20;
int columns = 30;
p = (int**)malloc(20 * sizeof(int)); //First "bookend" allocates space
printf("Hello World! I have created a dynamic 20-array of 20x30 integers!n");
if (p == NULL)
{
printf("Failed to allocated memory!");
exit(1);
}
for (i = 0; i < 20; i++)
{
if (p[i] == NULL)
{
printf("Integers not allocated! ");
}
p[i] = (int**)malloc(20 * sizeof(int));
}
for (i = 0; i < 20; i++)
{
for (j = 0; j < 20; j++)
{
if (p[j] == NULL)
{
printf("Integers not allocated! ");
}
p[i][j] = (int *)malloc(40 * sizeof(int));
}
printf("%dn", p[(i+1)+j]);
}
free(p);
return 0;
}
我希望我答对了你的问题......
你得到的并不完全是石榴弹... 执行p[i][j] = (int *)malloc(40 * sizeof(int));
时,您只需再分配一个包含 40 个元素的数组并将其地址放在p[i][j]
中......因此,当您尝试打印p[(i+1)+j]
时,您正在打印您malloc'd的40个元素数组的地址。
您的代码存在几个问题:
- 对于初始分配,每个元素都是一个
int *
,所以你需要20 * sizeof(int *)
,而不是20 * sizeof(int)
。 malloc
分配的任何空间都是未初始化的,因此尝试读取它是未定义的行为。 另一方面,如果您使用calloc
,则将分配的内存初始化为全部 0。- 您将经历一组额外的循环,尝试将另一个数组分配给每个
int
位置。 如果您尝试创建一个 3D 数组(并p
定义为int ***
),则可以工作,但不适用于 2D 数组。 - 不要强制转换 malloc 的返回值,因为这会掩盖细微的错误。
如果要动态分配 20 X 30 的 int
数组,可以这样做:
// first allocate 20 int*
int **p = malloc(20 * sizeof(int *));
if (p == NULL) {
perror("malloc failed");
exit(1);
}
int i;
for (i=0;i<30;i++) {
// for each row, allocate 30 int
p[i] = malloc(30 * sizeof(int));
if (p[i] == NULL) {
perror("malloc failed");
exit(1);
}
}
请注意,这不会在 2D 数组中设置任何值,它只是为其分配内存。