不确定我关于 malloc (c) 的输出



在理解输出时,我应该考虑什么?因为现在我的输出是 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 数组中设置任何值,它只是为其分配内存。

最新更新