使用realloc的动态二维数组会出现分割错误,但可以使用malloc



我有一个问题,我的动态二维数组。对于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]将导致未定义行为,您所经历的分割错误是未定义行为的副作用之一。


编辑:

你应该在第一个malloc之后初始化gmatrix[i]NULL,正如@MattMcNabb指出的那样。因此,在第一次调用realloc之后使用以下代码:

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

相关内容

  • 没有找到相关文章

最新更新