我是 C 语言的初学者,我正在尝试学习如何使用二维矩阵的动态分配。有人能告诉我为什么它会给我带来问题吗? (在
main
函数中,我使用 10 和 11 作为测试大小。)
#include <stdio.h>
#include <stdlib.h>
void insert_values(int **arr, int dim, int size);
void resize(int ***arr, int dim) {
if (*arr == NULL) {
*arr = (int **)malloc(dim * sizeof(int *));
if (!*arr) return;
} else {
*arr = (int **)realloc(*arr, dim * sizeof(int *));
if (*arr == NULL) return;
}
for (int i = 0; i < dim; i++) {
if((*arr)[i] == NULL){
(*arr)[i] = (int *)malloc(dim * sizeof(int));
if (!(*arr)[i]) return;
break;
}
else{ //se esiste la posizione allora lo rialloco
(*arr)[i] = (int *)realloc(**arr, dim * sizeof(int));
if ((*arr)[i] == NULL) return;
}
}
}
void insert_values(int **arr, int dim, int size){
if(size > dim){
resize(&(arr), size);
}
int x;
int y;
for(x = 0; x<size; x++){
for(y = 0; y<size; y++){
arr[x][y] = x+y;
printf("%d |", arr[x][y]);
}
printf("\n");
}
}
void print_values(int **arr, int size){
for(int i = 0; i<size; i++){
for(int j = 0; j<size; j++){
printf("%d |", *(arr+i)[j]);
}
printf("\n");
}
}
int main(int argc, char *argv[]){
int **x = (int**)malloc(10*sizeof(*x));
if(!x){return 0;}
for(int i=0; i<10; i++){
x[i]= (int*)malloc(10*sizeof(int));
}
insert_values(x, 10,11);
print_values(x, 11);
for(int i=0; i<10; i++){
free(x[i]);
}
free(x);
}
0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10 |
1 |2 |3 |4 |5 |6 |7 |8 |9 |10 |11 |
2 |3 |4 |5 |6 |7 |8 |9 |10 |11 |12 |
3 |4 |5 |6 |7 |8 |9 |10 |11 |12 |13 |
4 |5 |6 |7 |8 |9 |10 |11 |12 |13 |14 |
5 |6 |7 |8 |9 |10 |11 |12 |13 |14 |15 |
6 |7 |8 |9 |10 |11 |12 |13 |14 |15 |16 |
7 |8 |9 |10 |11 |12 |13 |14 |15 |16 |17 |
8 |9 |10 |11 |12 |13 |14 |15 |16 |17 |18 |
9 |10 |11 |12 |13 |14 |15 |16 |17 |18 |19 |
10 |11 |12 |13 |14 |15 |16 |17 |18 |19 |20 |
-533986992 |-533955728 |
这是在
insert_values
期间有效的输出,但在 print_values
中它给了我一个分段错误。
我可以看到您的代码中有两个功能问题。
print_values
的 11
,而不是用于创建矩阵的 10
。这会导致数组访问越界和未定义的行为。在这种情况下,会导致分段错误。*(arr+i)[j]
中的print_values
被解析为(*(arr+i))[j]
,这是不正确的,应该替换为更容易理解的arr[i][j]
,这是正确的。您可以采取一个简单的步骤,通过从代码中删除“amgicnumbers”来避免第一个问题。使用预处理器
#define
或 const size_t
变量来定义矩阵的维度。在一个地方对此进行的更改将通过您的代码传播到使用它的任何地方。