这是我编写的代码,用于获取矩阵的值并显示它
#include<stdio.h>
int ** readMatrix(int rows, int cols)
{
int i,j, matrix[rows*cols];
int *b[rows];
int **y=b;
int k=0;
for(k=0; k < rows; k++)
{
b[k]=&matrix[k*cols];
}
for(i=0; i< rows*cols; i++)
{
scanf("%d", matrix+i);
}
return y;
}
void displayMatrix(int **a, int rows, int cols)
{
int k=0,j;
for(k=0; k < rows; k++)
{
for(j=0; j < cols; j++)
{
printf("%d ", *(*(a + k) + j));
}
printf("\n");
}
}
int main()
{
int rows,cols;
printf("Enter the number of rows:\n");
scanf("%d",&rows);
if(rows <= 0)
{
printf("Invalid Input");
}
else
{
printf("Enter the number of columns:\n");
scanf("%d",&cols);
if(cols <= 0)
{
printf("Invalid Input");
}
else
{
printf("Enter the values:\n");
int **a = readMatrix(rows, cols);
displayMatrix(a, rows, cols);
}
}
}
程序在displayMatrix
的循环中陷入困境,但如果我删除外部for循环,它会显示正常。
我得到的错误是Segmentation fault (core dumped)
。
我做错了什么?
PS:我必须使用带有双指针的上述函数签名。
答案 0 :(得分:1)
readMatrix
中的问题是它返回指向该函数中局部变量的指针。您不应该这样做,因为在函数返回后局部变量会被释放,这就是您获得分段错误的原因。
您需要在函数中创建一个malloc
(并记住free
它)。您需要将#include <stdlib.h>
放在顶部,并使用其他标头来访问这些功能。您可以看到下面的更改,以使其工作。
int** readMatrix(int rows, int cols) {
int i, j;
int **matrix = malloc(rows * sizeof(int*));
for(i = 0; i < rows; i++) {
matrix[i] = malloc(cols * sizeof(int));
for(j = 0; j < cols; j++) {
scanf("%d", &matrix[i][j]);
}
}
return matrix;
}
现在有一个释放这个数据结构的函数可能会有所帮助。这是你如何做到的。
void freeMatrix(int **matrix, int rows) {
int i;
for(i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
}
然后更改main
功能以适应这些更改,如下所示。
int **a = readMatrix(rows, cols);
displayMatrix(a, rows, cols);
freeMatrix(a, rows);