【发布时间】:2017-05-05 20:02:58
【问题描述】:
我在学习的时候正在做一些事情,我遇到了下一个问题。 为了简化和缩短问题,我将代码完全简化为问题。
我想读取一个矩阵并将其输出到我的屏幕上。 但是当我运行这段代码时:
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;
}
这个问题是我在代码块中看不到手表中的值。对于 mat[0][0](例如)而不是矩阵的第一个元素,我看到这个“无法对不完整类型执行指针数学,尝试转换为已知类型或 void *。”
对我来说,这是一种奇怪的行为,我不明白。 为什么我在第一个版本中出现分段错误,为什么我在手表窗口中看不到矩阵?
【问题讨论】:
-
行内存分配循环使用
col作为循环限制,应该是row,你为行指针分配了太多内存,这应该成为mat = malloc(row * sizeof(int *)); -
@WeatherVane 谢谢
-
@terencehill 谢谢