簡體   English   中英

C中的分段錯誤(具有動態內存分配的2D陣列)

[英]Segmentation fault (2D array with dynamic memory allocation) in C

我仍然無法使用malloc,calloc或realloc。 可以肯定的是,由於指針不正確或其他原因而導致分段錯誤,但是對於我的生命,我不知道自己在哪里做錯了。 當用戶輸入為“ 5 5”時,該程序將運行,否則會導致該程序運行異常,並且經常會因分段錯誤而失敗。 矩陣A和B應該使用隨機數填充,並且矩陣C應該始終使用動態內存分配對矩陣A和B求和。 我對分配不熟悉,我才剛剛開始了解指針和2D數組。 有人可以解釋我在做什么錯。 這是完整的代碼。

#include <stdio.h>
#include <stdlib.h>
#define ROWS 10
#define COLUMNS 10

void fillMatrix (int *matrix, int rows, int columns)
{
    int i, j;
    for(i = 0; i < rows; i++)
    {
        for(j= 0; j < columns; j++)
        {
            matrix[i * COLUMNS + j] = (rand() % 10) + 1;
        }
    }
}
void printMatrix (int *matrix, int rows, int columns)
{
    int i, j;
    for(i = 0; i < rows; i++)
    {
        for(j= 0; j < columns; j++)
        {
            printf("%2d ", *(matrix + i * COLUMNS + j));
        }
    printf("\n\n");
    }
}
void sumMatrix (int *matrix, int *matrixA, int *matrixB, int rows, int columns)
{
    int i, j;
    for(i = 0; i < rows; i++)
    {
        for(j= 0; j < columns; j++)
        {
            matrix[i * COLUMNS + j] = matrixA[i * COLUMNS + j] + matrixB[i * COLUMNS + j];
        }
    }
}

int main()
{
    int *matrixA = NULL, *matrixB = NULL, *matrixC = NULL;
    int matrix[ROWS][COLUMNS], r, s, i;
    srand((unsigned) time(NULL));
    do{
    printf("Rows and columns (min 1 1, max 10 10): ");
    scanf("%d %d", &r, &s);
    }while(r > ROWS || r < 1 || s > COLUMNS || s < 1);

    matrixA = malloc(r * sizeof(int *));
    for (i = 0; i < r; i++)
        matrixA[i] = malloc(s * sizeof(int));

    printf("\nMatrix A:\n\n");
    fillMatrix(matrixA, r, s);
    printMatrix(matrixA, r, s);

    matrixB = calloc(r, sizeof(int *));
    for (i = 0; i < r; i++)
        matrixB[i] = calloc(s, sizeof(int));

    printf("\nMatrix B:\n\n");
    fillMatrix(matrixB, r, s);
    printMatrix(matrixB, r, s);

    matrixC = calloc(r, sizeof(int *));
    for (i = 0; i < r; i++)
        matrixC[i] = calloc(s, sizeof(int));

    printf("\nSummed up (Matrix C):\n\n");
    sumMatrix(matrixC, matrixA, matrixB, r, s);
    printMatrix(matrixC, r, s);

    free(matrixA);
    free(matrixB);
    free(matrixC);
    return 0;
}

您將所有矩陣作為一維數組訪問,因此應相應地分配它們。

例如: int* matrixA = malloc(r*s*sizeof(int));

就這樣; 無需執行for (i = 0; i < r; i++)循環。

此外,您在所有函數中使用的是COLUMNS宏而不是columns參數。

顯然,如果COLUMNS > columns ,那么在某些時候您將遇到內存訪問沖突...

這里的問題是矩陣中的存儲位置不連續。 但是在所有的打印/填充/求和矩陣函數中,您都假設它們是。

假設一個2x2矩陣A。您的代碼將以以下方式分配內存。 addr1是一個數組的起始地址,addr2是第二個數組的起始地址。

A [0] addr1(addr1 + sizeof(int))
A [1] addr2(addr2 + sizeof(int))

但這是您需要的:

A [0] addr1 addr1 + sizeof(int)
A [1](addr1 + 2 * sizeof(int))(addr1 + 3 * sizeof(int))

因此,您需要將malloc語句替換為一個malloc:matrixA = malloc(r * s * sizeof(int))此外,您假設每一行的元素數均為COLUMN,而不是's'。 如果是這種情況,則應使用malloc:matrixA = malloc(r * COLUMNS * sizeof(int)),但我不確定為什么需要其他未使用的列。

另外,int matrix [ROWS] [COLUMNS]似乎未使用。

對malloc有問題,您正在嘗試創建數組數組而不是2d數組,則應將其修復:

matrixA = malloc(r * c * sizeof(int)); // no any kind of additional for loop here, 1 malloc per matrix
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROWS 10
#define COLUMNS 10

void fillMatrix (int *matrix, int rows, int columns)
{
    int i, j;
    for(i = 0; i < rows; i++)
    {
        for(j= 0; j < columns; j++)
        {
            matrix[i * COLUMNS + j] = (rand() % 10) + 1;
        }
    }
}
void printMatrix (int *matrix, int rows, int columns)
{
    int i, j;
    for(i = 0; i < rows; i++)
    {
        for(j= 0; j < columns; j++)
        {
            printf("%2d ", matrix[ i * COLUMNS + j]);
        }
        printf("\n\n");
    }
}
void sumMatrix (int *matrix, int *matrixA, int *matrixB, int rows, int columns)
{
    int i, j;
    for(i = 0; i < rows; i++)
    {
        for(j= 0; j < columns; j++)
        {
            matrix[i * COLUMNS + j] = matrixA[i * COLUMNS + j] + matrixB[i * COLUMNS + j];
        }
    }
}

int main()
{
    int *matrixA = NULL, *matrixB = NULL, *matrixC = NULL;
    int matrix[ROWS][COLUMNS], r, s, i;
    srand((unsigned) time(NULL));
    do{
    printf("Rows and columns (min 1 1, max 10 10): ");
    scanf("%d %d", &r, &s);
    }while(r > ROWS || r < 1 || s > COLUMNS || s < 1);

    matrixA = malloc(COLUMNS*r * sizeof(int));

    printf("\nMatrix A:\n\n");
    fillMatrix(matrixA, r, s);
    printMatrix(matrixA, r, s);

    matrixB = calloc(r*COLUMNS,sizeof(int));

    printf("\nMatrix B:\n\n");
    fillMatrix(matrixB, r, s);
    printMatrix(matrixB, r, s);

    matrixC = calloc(r*COLUMNS, sizeof(int));

    printf("\nSummed up (Matrix C):\n\n");
    sumMatrix(matrixC, matrixA, matrixB, r, s);
    printMatrix(matrixC, r, s);

    free(matrixA);
    free(matrixB);
    free(matrixC);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM