我在学习时正在做某事,遇到了下一个问题。 为了简化和缩短问题,我将代码精确地缩减为问题。
我想读取一个矩阵并将其输出到屏幕上。 但是当我运行这段代码时:
int main(){
int in, jn, row, col, **mat;
scanf("%d %d", &row, &col);
mat = (int **) malloc(row * col * sizeof(int *));
for(in = 0; in < col; in++){
mat[in] = (int *) malloc((col + 1) * sizeof(int));
}
if(mat == NULL){
printf("Error. Allocation was unsuccessful. \n");
return 1;
}
for(in = 0; in < row; in++){
for(jn = 0; jn < col; jn++){
scanf("%d", &mat[in][jn]);
}
}
for(in = 0; in < row; in++){
for(jn = 0; jn < col; jn++){
printf("%d ", mat[in][jn]);
}
printf("\n");
}
return 0;
}
我遇到段错误。我调试了程序,当 in = 2 和 jn = 0 时出现错误。所以我读到: 1 2 3 4 在这里,当我尝试读入 mat[2][0] 时,出现段错误。我不明白为什么。 The error
我这里有另一个版本:
int main(){
int in, jn, row, col;
scanf("%d %d", &row, &col);
int mat[row][col];
for(in = 0; in < row; in++){
for(jn = 0; jn < col; jn++){
scanf("%d", &mat[in][jn]);
}
}
for(in = 0; in < row; in++){
for(jn = 0; jn < col; jn++){
printf("%d ", mat[in][jn]);
}
printf("\n");
}
return 0;
}
这个问题是我看不到代码块中 watch 的值。对于 mat[0][0](例如),而不是矩阵的第一个元素,我看到“无法对不完整类型执行指针数学,请尝试转换为已知类型,或 void *。”
对我来说这是一种奇怪的行为,我不明白。 为什么我在第一个版本中出现段错误,为什么我在 watch 窗口中看不到矩阵?
最佳答案
类型 (*int) 的内存分配量已关闭。 您所需要的只是行数。 对于每一行,只需要类型 (int) 的列数。 这是数组和指针之间差异的链接。 link
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(){
int in, jn, row, col, **mat;
scanf("%d %d", &row, &col);
mat = malloc(row * sizeof(int *));
if(mat == NULL){
printf("Error. Allocation was unsuccessful. \n");
return 1;
}
for(in = 0; in < row; in++){
mat[in] = malloc(col * sizeof(int));
assert(mat[in]!=NULL);
}
for(in = 0; in < row; in++){
for(jn = 0; jn < col; jn++){
scanf("%d", &mat[in][jn]);
}
}
for(in = 0; in < row; in++){
for(jn = 0; jn < col; jn++){
printf("%d ", mat[in][jn]);
}
printf("\n");
}
return 0;
}
关于c - **矩阵的工作方式与矩阵[行][列]有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812947/