如果有人通过使用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日
答案 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));