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

时间:2016-05-26 00:06:23

标签: c arrays malloc

在理解输出时我应该考虑什么?因为现在我的输出是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;
}

2 个答案:

答案 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数组。
  • 不要强制转换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数组中设置任何值,只是为它分配内存。

相关问题