在理解输出时我应该考虑什么?因为现在我的输出是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("%d\n", p[(i+1)+j]);
}
free(p);
return 0;
}
答案 0 :(得分:0)
我希望我的问题正确......
你得到的并不完全是基础...在做p[i][j] = (int *)malloc(40 * sizeof(int));
时,你只需再分配一个包含40个元素的数组并将其地址放在p[i][j]
中...所以当你尝试时print p[(i+1)+j]
您正在打印malloc'd的40个元素数组的地址。
答案 1 :(得分:0)
您的代码存在以下问题:
int *
,因此您需要20 * sizeof(int *)
,而不是20 * sizeof(int)
。malloc
分配的任何空间都未初始化,因此尝试读取它是未定义的行为。另一方面,如果使用calloc
,则将分配的内存初始化为全0。int
位置。如果您尝试创建一个3D数组(并将p
定义为int ***
)可以使用,但不适用于2D数组。如果你想动态分配一个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数组中设置任何值,只是为它分配内存。