我正在尝试阅读Matrix,如下所示: 我在Cygwin和MinGW编译器上尝试过它。
#include <stdio.h>
#include <stdlib.h>
typedef struct _Matrix {
int **data;
int m;
int n;
} Matrix;
Matrix *read_matrix(void) {
Matrix *A;
int i, j;
int **ptr;
A = (Matrix *) malloc(sizeof(Matrix));
if(A == NULL) {
return NULL;
}
printf("Enter m : ");
scanf("%d", &A->m);
printf("Enter n : ");
scanf("%d", &A->n);
ptr = (int **) malloc(A->m * A->n * sizeof(int));
/*-- >> A->data = ptr; << --*/
if(A->data == NULL) {
return NULL;
}
printf("\n");
for(i=0; i<A->m; ++i) {
for(j=0; j<A->n; ++j) {
printf("Enter element [%d][%d] : ", i, j);
scanf("%d", &ptr[i][j]);
}
}
A->data = ptr;
return A;
}
int main() {
Matrix *A;
A = read_matrix();
free(A->data); /* A-- A->data is NULL --*/
free(A);
return 0;
}
如果我在读取值之前设置A->data
,我会得到SEGMENTATION FAULT
。
但是,此处的代码似乎没有崩溃。但是A->data
会返回NULL
。我在这里缺少什么?
答案 0 :(得分:2)
单个指针就是正在使用的分配所需的全部内容。
#include <stdio.h>
#include <stdlib.h>
typedef struct _Matrix {
int *data; //single pointer
int m;
int n;
} Matrix;
Matrix *read_matrix(void) {
Matrix *A;
int i, j;
A = malloc(sizeof(Matrix));
if(A == NULL) {
return NULL;
}
printf("Enter m : ");
scanf("%d", &A->m);
printf("Enter n : ");
scanf("%d", &A->n);
A->data = malloc(A->m * A->n * sizeof(int));
if(A->data == NULL) {
return A;
}
printf("\n");
for(i=0; i<A->m; ++i) {
for(j=0; j<A->n; ++j) {
printf("Enter element [%d][%d] : ", i, j);
scanf("%d", &A->data[( j * A->m) + i]);
}
}
return A;
}
int main() {
Matrix *A;
int i;
int j;
A = read_matrix();
if ( A) {
if ( A->data) {
for(i=0; i<A->m; ++i) {
for(j=0; j<A->n; ++j) {
printf("A[%d][%d]= %d\n", i, j, A->data[( j * A->m) + i]);
}
}
free(A->data);
}
free(A);
}
return 0;
}