我创建了一个从外部txt文件打印2维矩阵的程序。如果我定义静态矩阵,例如A [10] [10],我的程序就可以工作。但我想动态分配内存。
当我尝试这段代码时:
int **A = (int **)malloc(N * N * sizeof(int));
出现以下错误:
dataStructures4.exe中0x00AC159B处的未处理异常: 0xC0000005:访问冲突写入位置0xCDCDCDCD。
在这个循环中:
for(i=0; i<N; i++){
for(j=0; j<N; j++){
A[i][j] = -1;
}
}
我想我无法正确生成动态矩阵。我该如何修改我的代码?
答案 0 :(得分:6)
您动态创建2d数组作为指向int*
指针块的指针,这些指针指向int
个块。
所以有两个步骤:
1)A
指向int*
int **A = (int **)malloc(N * sizeof(int*));
2)每个人都指向int
s
for(i=0; i<N; i++){
A[i] = (int *)malloc(N * sizeof(int));
}
答案 1 :(得分:3)
使用指向特定大小的数组的指针:
您可以使用#define定义N,或使用变量:
int n = 10 ;
int (*A)[n] = malloc(n * n * sizeof(int));
这样你就会得到一块连续的内存。
答案 2 :(得分:1)
请注意A[i][j]
与*(*(A+i)+j)
相同。您的代码已损坏,因为*(A+i)
取消引用了无效的未初始化指针。这发生在这一行:
A[i][j] = -1;
另一种方法是使用动态分配的指针数组,其中每个元素指向另一个动态分配的数组。你可以这样做:
int **array = malloc(N*sizeof(*array));
for (int i = 0; i < N; i++)
array[i] = malloc(N*sizeof(*array[i]));
/* Use array[i][j]... */
请注意,内存布局与2D数组的内存布局非常不同,但表达式array[i][j]
将执行您想要的操作 - 它将“看起来”就像您拥有2D数组一样。
答案 3 :(得分:1)
分别分配每一行,如下所示:
int **A = (int **)malloc(N * sizeof(int*));
for(i=0; i<N; i++){
A[i] = (int *)malloc(N * sizeof(int));
}
答案 4 :(得分:1)
与数组相同,2维矩阵包含连续的地址空间。所以理论上有一种方法可以达到这个目的。
int m = 2;
int n = 4;
int *a = malloc(m*n*sizeof(int));
int **b = malloc(m*sizeof(int*));
for(int i=0, i<m, i++)
{
b[i] = a+i*n;
}
通过这种方式,b可以根据需要用作矩阵。但是,它会浪费malloc(m * sizeof(int *))来保存b。
或者你可以:
int m = 2;
int n = 4;
int *a = malloc(m*n*sizeof(int));
使用[m * i + j]作为[i] [j]
答案 5 :(得分:0)
希望以下内容很好。我没有测试它,只是为您提供语法。
int** abc; // Your 2D array pointer abc[N][M]
abc = (int**)malloc(dim1_max * sizeof(int*)); // dim1_max is N
for (int i = 0; i < dim1_max; i++) {
abc[i] = (int*)malloc(dim2_max * sizeof(int)); // dim2_max is M
}
[....your array used....]
//Once you allocate dynamically you need to free the memory. IMP point.
for (int i = 0; i < dim1_max; i++) {
free(abc[i]);
}
free(abc);