到目前为止,在我的程序中,我正在动态分配4个矩阵(以使我可以通过arr [row] [col]访问数组成员的方式),然后用一些值填充它们(后来乘以multi-线程)。该程序采用3个整数,n,m和p。矩阵A为n * m,B为m * p,C1 / C为n * p。我遇到的问题是某些输入会导致段错误,而另一些则不会。例如,输入4 4 4可以很好地分配并填充数组插槽,但是当尝试访问代码填充部分中的数组成员时,5 5 5给我一个段错误。任何帮助将不胜感激。
#include <stdlib.h>
#include <stdio.h>
int **A;
int **B;
int **C1;
int **C;
void allocateMatrices(int n, int m, int p) {
int i, j;
/* Allocate n * m array */
A = malloc(n * sizeof(int));
for (i = 0; i < n; i++) {
A[i] = malloc(m * sizeof(int));
}
/* Allocate m * p array */
B = malloc(m * sizeof(int));
for (i = 0; i < m; i++) {
B[i] = malloc(p * sizeof(int));
}
/* Allocate two n * p arrays */
C1 = malloc(n * sizeof(int));
C = malloc(n * sizeof(int));
for (i = 0; i < n; i++) {
C[i] = malloc(p * sizeof(int));
C1[i] = malloc(p * sizeof(int));
}
/* Fill matrix A */
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
A[i][j] = i * j;
}
}
/* Fill matrix B */
for (i = 0; i < m; i++) {
for (j = 0; j < p; j++) {
B[i][j] = i + j;
}
}
}
int main() {
int n, m, p;
printf("Enter n (<=6000), m (<=3000), p (<=1000): ");
scanf("%d %d %d", &n, &m, &p);
allocateMatrices(n, m, p);
}
在2D数组中,您应该像这样首先为rows
分配内存:
row=malloc(number * sizeof(int *))
然后像您一样为cols
分配内存。
因为行应该是指向数组第二维的指针。
所以A = malloc(n * sizeof(int));
不正确,应该是A = malloc(n * sizeof(int*));
,这意味着您正在为指针而不是整数分配内存。