c中矩阵的重新分配

reallocation of a Matrix in c

可能这是一个很愚蠢的问题,但我看不透,也许你能帮忙?

我的问题是矩阵的重新分配,向其添加 1 列和 1 行,然后用“INFINITY”填充新元素。

#include <stdio.h>
#include <stdlib.h>

int main(){
    int i, j, size = 3;
    float **mat;

    //Initial allocation
    mat = malloc(size* sizeof(float *));
    for(i = 0; i < size; i++) {
        mat[i] = malloc(size * sizeof(float));
        for (j = 0; j < size; j++)
            mat[i][j] = 1;
    }

    //Print initial matrix
    for(i=0; i<size; i++) {
        for (j = 0; j < size; j++)
            printf("%f ", mat[i][j]);
        puts("\n");
    }

    //I'm going to add a row and a column
    void *pointer = realloc(mat, (size+1)*sizeof(float*));
    if(pointer != NULL) {
        mat = pointer;
        mat[size] = malloc((size+1)*sizeof(float));
    }else
        fprintf(stderr, "Error: allocation");

    for(i = 0; i <= size; i++) {
        mat[i][size] = 0;
        mat[size][i] = 0;
    }

    //Print altered matrix
    for(i=0; i<=size; i++) {
        for (j = 0; j <= size; j++)
            printf("%f ", mat[i][j]);
        puts("\n");
    }

    //Here comes the free
    for (i = 0; i < size+1; i++){
        free(mat[i]);  // <-- Debug says SIGTRAP
    }
    free(mat);
    return 0;
}

在此先感谢您的帮助。

编辑:我注意到只有在调试时才会出现该错误,而不是 运行 通常情况下。我的 IDE 是克利昂。

假设您最初有一个 2x2 数组。

x x
x x

调用 realloc 和 malloc 后,您创建了一个如下所示的对象:

x x
x x
x x x

要解决此问题,您还需要在每一行上调用 realloc。


完整的解决方案可能如下所示:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
    int i, j, size = 3;
    float **mat;

    // Initial allocation
    mat = malloc(size * sizeof(float *));
    for(i = 0; i < size; i++)
        mat[i] = malloc(size * sizeof(float));

    // Initial values
    for(i = 0; i < size; i++)
        for (j = 0; j < size; j++)
            mat[i][j] = 1;

    // Print initial matrix
    for(i = 0; i < size; i++) {
        for (j = 0; j < size; j++)
            printf("%f ", mat[i][j]);
        printf("\n");
    }
    printf("\n");

    // I'm going to add a row and a column
    mat = realloc(mat, (size+1)*sizeof(float*));
    for(i = 0; i < size; i++)
        mat[i] = realloc(mat[i], (size+1)*sizeof(float));
    mat[size] = malloc((size+1) * sizeof(float));

    for(i = 0; i <= size; i++) {
        mat[i][size] = 0;
        mat[size][i] = 0;
    }

    //Print altered matrix
    for(i = 0; i <= size; i++) {
        for (j = 0; j <= size; j++)
            printf("%f ", mat[i][j]);
        printf("\n");
    }

    //Here comes the free
    for (i = 0; i <= size; i++)
        free(mat[i]);
    free(mat);
}