使用指针指针方法读取和打印矩阵

时间:2015-10-05 01:42:23

标签: c gcc codeblocks

我编写了一个程序,用于在不使用指针数组的情况下读取和打印矩阵。该程序正在正确读取和打印矩阵,但在执行后崩溃。程序中没有警告。无法找到该程序的错误。我正在使用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;
}

1 个答案:

答案 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]将包含一些垃圾值,并可能导致你在内存中的一些不需要的区域。