C中的分段错误(具有动态内存分配的2D阵列)

时间:2014-04-29 17:48:28

标签: c arrays pointers dynamic allocation

我仍然使用malloc,calloc或realloc。很确定我因为指针不正确而导致分段错误,但对于我的生活,我不明白我做错了什么。当用户输入为“5”时,该程序仍然有效,除此之外的任何其他操作都会导致程序出现奇怪的行为并且通常会因分段错误而失败。矩阵A和B应填充随机数,矩阵C应使用动态内存分配对矩阵A和B求和。我不熟悉allocs,我刚刚开始理解指针和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;
}

4 个答案:

答案 0 :(得分:2)

您可以将所有矩阵作为单维数组访问,因此应该相应地分配它们。

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

全部;无需执行for (i = 0; i < r; i++)循环。

此外,您在所有功能中使用COLUMNS宏而不是columns参数。

显然,如果COLUMNS > columns,那么您最终会在某个时候发生内存访问违规行为......

答案 1 :(得分:1)

这里的问题是矩阵中的内存位置不连续。但是在你所有的打印/填充/求和矩阵函数中,你都假设它们是。

假设一个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个元素而不是&#39; s&#39;数。如果是这样,你应该malloc: matrixA = malloc(r * COLUMNS * sizeof(int)),但我不确定为什么你需要其他未使用的列。

此外,int矩阵[ROWS] [COLUMNS]似乎未被使用。

答案 2 :(得分:0)

有malloc的问题,你试图创建数组而不是2d数组,你应该修复它:

matrixA = malloc(r * c * sizeof(int)); // no any kind of additional for loop here, 1 malloc per matrix

答案 3 :(得分:0)

#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;
}