c - 使用 realloc 的动态二维数组会出现段错误,但可以与 malloc 一起使用

标签 c multidimensional-array segmentation-fault malloc realloc

我的动态二维数组有问题。 使用 malloc 就可以了。使用realloc,它失败了。

这不起作用:

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

int main(int argc, char *const *argv) {

    unsigned ** gmatrix = NULL;
    int cap = 4;

    /*
    ...
    */

    gmatrix = realloc(gmatrix, 4 * sizeof(unsigned*));
    for(unsigned i = 0; i < cap; i++) {
        gmatrix[i] = realloc(gmatrix, cap* sizeof(unsigned));
    }
    // initialize:
    for(unsigned i = 0; i < cap; i++) {
        for(unsigned j =  0; j < cap; j++) {
            gmatrix[i][j] = 0;
        }
    }

}

但这确实:

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

int main(int argc, char *const *argv) {

    unsigned ** gmatrix = NULL;
    int cap = 4;

    /*
    ...
    */
    gmatrix = malloc(cap * sizeof(unsigned*));
    for(unsigned i = 0; i < cap; i++) {
        gmatrix[i] = malloc(cap* sizeof(unsigned));
    }
    for(unsigned i = 0; i < cap; i++) {
        for(unsigned j =  0; j < cap; j++) {
            gmatrix[i][j] = 0;
        }
    }

}

在第一个代码部分中,我收到段错误错误。为什么?

最佳答案

gmatrix[i] = realloc(gmatrix, cap* sizeof(unsigned));

应该是

gmatrix[i] = realloc(gmatrix[i], cap* sizeof(unsigned));

使用gmatrix而不是gmatrix[i]将导致Undefined Behavior您遇到的段错误是 Undefined Behavior 的副作用之一.

<小时/>

编辑:

您应该在第一个 malloc 之后将 gmatrix[i] 初始化为 NULL,如 @MattMcNabb pointed out 。因此,在第一次调用 realloc 后使用以下内容:

for(unsigned i = 0; i < cap; i++) {
    gmatrix[i] = NULL;
    gmatrix[i] = realloc(gmatrix[i], cap* sizeof(unsigned));
}

关于c - 使用 realloc 的动态二维数组会出现段错误,但可以与 malloc 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30555169/

相关文章:

powershell - 动态将项目添加到集合数组中

python - numpy中ndarray的 "ndim, shape, size, ..etc"的身份是什么

c# - 为什么 C/C++ 有头文件,不像 C# 和 Java 等其他语言?

对字符串的 C 指针操作会产生意外的输出

C、动态分配一个矩阵: Why is this not allowed?

c - 使用 C 中的文件实现的 B 树(不是 B+/B*)中的问题

c++ - 将图片旋转 90 度时复制像素 [Vec3d vs Vec3b]

c++ - 使用 cerr 修复的链表段错误

c++ - cmake find_library 和 CMAKE_FIND_ROOT_PATH

c++ - 指向数组重叠数组末端的指针