填充动态二维数组时出现段故障

问题描述 投票:0回答:1

到目前为止,在我的程序中,我正在动态分配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);
}
c matrix memory-management
1个回答
0
投票

在2D数组中,您应该像这样首先为rows分配内存:

row=malloc(number * sizeof(int *))

然后像您一样为cols分配内存。

因为行应该是指向数组第二维的指针。

所以A = malloc(n * sizeof(int));不正确,应该是A = malloc(n * sizeof(int*));,这意味着您正在为指针而不是整数分配内存。

© www.soinside.com 2019 - 2024. All rights reserved.