使用malloc()动态多维(2D)数组?

时间:2013-12-27 20:37:54

标签: c arrays

如果有人通过使用malloc函数告诉我这段代码有什么问题,我不知道该怎么做。

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <process.h>

 int main()
 {
 int row;
 int column;
 int j=0;
 int **ptr;

 printf("Number of rows: \n");
 scanf ("%d",&row);
 printf("Number of columns: \n"); 
 scanf ("%d",&column);  

有一个错误,????如果有人知道该怎么做,请取悦

 int* ptr = malloc( row * sizeof(*ptr) ); /*Allocate integer pointers for the rows */
    if(ptr != NULL)
    {
        for(int m = 0; m < row; m++) /* Loop through each row pointer to allocate     memory for columns*/
        {
            /* Set p[i] pointer to a block of memory for 'column' number of integers */
            ptr[m] = malloc(column * sizeof **ptr); /*Here, sizeof(**p) is same as sizeof(int) */
            if(ptr[m] == NULL)
            {
                printf("Memory allocation failed. Exiting....");
                 exit(1);  
            }
        }

    }
    else
    {
        printf("Memory allocation failed. Exiting....");
         exit(1);  
    }





for(int i=0; i<row; i++)
{
   for(int j=0; j<column; j++)
{
printf("Enter values [%d] [%d]: \n",i+1,j+1 );  
scanf ("%d",&ptr[i][j]);
}
}


free (ptr); 
system("PAUSE");    
return 0;
}

请求回答,因为我需要在学校使用此代码,直到2014年1月3日

5 个答案:

答案 0 :(得分:3)

更改此行...

int* ptr = malloc( row * sizeof(*ptr) );

......对此...

ptr = malloc( row * sizeof(*ptr) );

您已在此处声明ptr

int **ptr;

答案 1 :(得分:1)

如果您认为需要使用malloc(和free)进行动态分配,那么这里已经有了一些好的答案。但请注意,您的示例中根本不需要使用malloc

您可以简单地声明一个可变大小的自动数组,如下所示。您的代码将非常清晰,并且可能会减少错误的可能性。自ISO C99(之前的某些编译器)以来,此功能在C语言中可用。

如果数组非常大,可能会有一个参数不使用变量大小的数组声明。你的例子是为每个数组元素提供用户输入,这样就告诉我你没有分配数百兆字节或任何会炸毁堆栈的东西!所以这对你很有用。祝你好运。

#include <stdio.h>

int main()
{
    int rows;
    int columns;

    printf("Number rows: ");
    scanf ("%d", &rows);
    printf("Stevilo columns: "); 
    scanf ("%d", &columns);  

    int values[rows][columns];   /* <-- no need to malloc(), no need to free() */

    for(int i=0; i<rows; i++) {
        for(int j=0; j<columns; j++) {
            printf("Enter value[%d][%d]: ",i+1,j+1 );  
            scanf("%d", &values[i][j]);
        }
    }
}

答案 2 :(得分:0)

不要使用sizeof (ptr)sizeof **ptr,而是尝试在第一个malloc中使用sizeof(int*),在第二个malloc中使用sizeof(int)

答案 3 :(得分:0)

谢谢大家这么快的答案,这非常有帮助,现在它的工作没有任何错误!

我这样做了:

    int** ptr = (int**) malloc(row * sizeof(int)); /*Allocate integer pointers for the rows */
    if(ptr != NULL)
    {
        for(int m = 0; m < row; m++) /* Loop through each row pointer to allocate memory for columns*/
        {
            /* Set p[i] pointer to a block of memory for 'column' number of integers */
            ptr[m] = (int*)malloc(column * sizeof(int)); /*Here, sizeof(**p) is same as sizeof(int) */
            if(ptr[m] == NULL)
            {
                printf("Memory allocation failed. Exiting....");
                 exit(1);  
            }
        }

    }
    else
    {
        printf("Memory allocation failed. Exiting....");
         exit(1);  
    }

答案 4 :(得分:-2)

首先关闭你的代码非常混乱。您的malloc调用也应如下所示:

   int** ptr = (int**)malloc(row * sizeof(ptr*));

指针的大小总是(几乎所有的时间,除非你在1982年制造的计算机上)是4,因为它的内存地址也就是一个4字节的int。在你的for循环中,它应该是这样的:

    ptr[m] = (int*)malloc(column * sizeof(ptr));