我编写了一个程序,用于在不使用指针数组的情况下读取和打印矩阵。该程序正在正确读取和打印矩阵,但在执行后崩溃。程序中没有警告。无法找到该程序的错误。我正在使用Codeblock + mingw 这种使用指针指向二维矩阵的方法也可以或者更好的方法吗?
#include <stdio.h>
#include <malloc.h>
int main()
{
int numCols=2;
int numRows=2;
int *cols;
int rowCount;
int colCount;
cols=(int*) malloc(numCols*sizeof(int));
int **rows;
rows= (int**) malloc(numRows*sizeof(cols));
printf("Filling the rows and Columns\n");
for(rowCount=0;rowCount<numRows;rowCount++)
{
printf("Fill Row Number %d\n",rowCount);
for(colCount=0;colCount<numCols;colCount++)
{
printf("Enter the value to be read\n");
scanf("%d",(*(rows+rowCount)+colCount));
}
}
// Printing the values
for(rowCount=0;rowCount<numRows;rowCount++)
{
printf("Print Row Number %d\n",rowCount);
for(colCount=0;colCount<numCols;colCount++)
{
printf("%d\t",*(*(rows+rowCount)+colCount));
}
printf("\n");
}
free(rows);
free(cols);
return 0;
}
答案 0 :(得分:1)
您没有以正确的方式分配内存。您的程序因非法内存访问而崩溃。
什么是Cols数组;因为你永远不会在其中存储任何整数及其额外的。第二行是一个数组int *而不是int。分配2D数组的方法之一是
int** matrix;
matrix = (int **)malloc(sizeof(int *));
matrix[0] = (int *)malloc(sizeof(int) * c * r);
//To access elements
for(rowCount=0;rowCount<numRows;rowCount++)
{
printf("Fill Row Number %d\n",rowCount);
for(colCount=0;colCount<numCols;colCount++)
{
printf("Enter the value to be read %d %d \n", rowCount, colCount);
scanf("%d",(*matrix+rowCount*numCols)+colCount);
}
}
//free it as
free(matrix);
在C语言中分配和访问行总是一个很好的做法,以便内存提取不是瓶颈。
是的,您可以像这样分配内存。
rows= (int**) malloc(numRows * numCols * sizeof(int)); //Yes sizeof(int)
。
它在C中完全合法的声明。它将分配numRows * numCols
大小的整数指针数组,每个元素的大小等于sizeof(int)
。
在指针长度为8字节的64位平台上可能会出现问题。
即使假设它是32位平台,也存在另一个问题。您将如何取消引用rows
以达到预期目的? rows [i]将是一个指向整数的指针,即int * type;但是对它执行scanf会给你一个分段错误,因为row [i]将包含一些垃圾值,并可能导致你在内存中的一些不需要的区域。