阵列的打印元素两次导致分段错误

时间:2016-11-20 20:41:11

标签: c arrays printf

我正在尝试在c中创建一个多维数组。出于测试目的,我试图打印第一行的第一个元素。代码似乎达到了这一点;但是,当我第二次尝试打印元素时,我遇到了分段错误:

#include <stdbool.h>
#include <stdio.h>

typedef struct Matrix {
    bool** elem;
    int length;
} Matrix;

void generateMatrix(Matrix* m);

int main() {
    Matrix m = {0, 0};
    generateMatrix(&m);

    fprintf(stdout, "%d ", m.elem[0][0]);

    fprintf(stdout, "\n");

    // Comment next line if you want it to work
    fprintf(stdout, "%d ", m.elem[0][0]);

    return 0;
}

void generateMatrix(Matrix* m) {
    const int size = 2;

    bool* ptrArray[size];
    bool ptr1[] = {false, false};
    bool ptr2[] = {true, true};

    ptrArray[0] = ptr1;
    ptrArray[1] = ptr2;
    m->elem = ptrArray;
    m->length = size;
}

我在ubuntu上使用gcc:

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609

为什么会这样?

1 个答案:

答案 0 :(得分:1)

问题出在generateMatrix

这里:

bool* ptrArray[size];
...
m->elem = ptrArray;

你正在使用一个局部变量的引用,它的生命周期仅限于函数调用,但是你将它存储在返回对象中。

所以你得到了未定义的行为。

第一次它起作用是因为你很幸运,但第二次,不知何故,内存被覆盖(函数调用经常修改堆栈,局部变量通常存储在堆栈中)。

修复:你实际上必须分配一些内存:

bool* ptrArray = malloc(size*sizeof(ptrArray[0]));

记忆具有全球寿命。除非您free,否则无法收集。