你好,我有一个关于读入一个pgm值的最低值的问题。我已经做了一个2d动态数组,并为高度和宽度添加了2个额外的空格,以便能够创建一个缓冲区,但是当我试图读取第一个整数到width+1时,它没有work.Any线索为什么代码停在这里?
FILE *pfile; //pointer to file
pfile=fopen(input_pgm,"r");
int columns,rows,value,line_of_numbers;
char pformat[50];
if (pfile==NULL){
printf("File is empty lame-o\n");
}
else{ //Read from file
fscanf(pfile,"%s",pformat); //Things like P2,P5
fscanf(pfile,"%d",&columns); //Number of columns ,M, Need & or it will store it into address
fscanf(pfile,"%d",&rows); //Number of rows , N
fscanf(pfile,"%d",&value); //Number of value, W
//Allocating 2D array to store M numbers
//printf("Test");
int **board;
board = (int **)malloc((rows + 2) * sizeof(int *));
for (i=0;i<rows+2;i++){
board[i]=(int*)malloc((columns+2)*sizeof(int));
}
//printf("Test2");
//INITILIZING TO 0
board=memset(board,0,((columns+2)*(rows+2)));
//printf("Test");
//reading in numbers on to board from 1->/rows/columns+1
for(i=1;i<=rows+1;i++){
for(j=1;j<=columns+1;j++){
//printf("Test3"); /*does not work after this*/
int scanned_num;
fscanf(pfile,"%d",&scanned_num);
board[i][j]=scanned_num;}
}发布于 2016-04-01 23:09:18
您似乎混淆了动态指针数组(即board的referent )和2D数组。这些根本不是一回事。特别要注意的是,为board分配内存的方法如下:
板= (int **)malloc((rows + 2) * sizeof(int *));
这将分配足够的内存来容纳指向int的rows + 2指针。(请注意,演员阵容是不必要的,并且被许多人认为是糟糕的风格。)那么这样做有什么意义呢……
板卡(
,0,((columns+2)*(rows+2);
?除了将结果赋值给columns是无用的这一事实之外,是什么让您认为指向int的rows + 2指针大小的空间必须至少是((columns+2)*(rows+2))个字节?除非非常小,否则您将超出 and的界限,从而产生未定义的行为。**
此外,您还会覆盖您刚刚在读*board**,中记录的所有行指针,将它们丢弃,从而泄漏您为行内容分配的所有内存。**如果此时您的程序没有崩溃,而是继续根据C语义对其余代码执行,那么当您尝试在循环(board[i][j]=scanned_num)中取消对这些指针的引用时,您将调用更多未定义的行为。还要注意,即使board是一个二维数组,您设置的字节数也是不正确的,因为每个int都大于一个字节。
将栅格作为一个大块进行分配是有意义的,也更容易,如果您使用的至少是C99,那么最简单的方法就是通过可变长度数组:
int board[rows + 2][columns + 2];
memset(board, 0, sizeof(board));然后,您甚至不需要在之后释放,尽管出于同样的原因,数组在函数的执行结束后不会存活。
如果您需要可以从函数返回的内容,那么您可以这样做:
int (*board)[columns + 2];
board = calloc(rows + 2, sizeof(*board));在这种情况下,calloc()会自动将分配的空间初始化为全零,因此您不需要自己执行此操作。
无论哪种方式,它都会获得所需的空间并用零填充;不需要做任何其他事情来准备它来接收数据。还要注意,就像在第二种情况下只使用一个calloc()调用一样,当您使用完动态分配的空间时,应该只使用一个对应的free()调用。
https://stackoverflow.com/questions/36358525
复制相似问题