我正在尝试在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
为什么会这样?
答案 0 :(得分:1)
问题出在generateMatrix
这里:
bool* ptrArray[size];
...
m->elem = ptrArray;
你正在使用一个局部变量的引用,它的生命周期仅限于函数调用,但是你将它存储在返回对象中。
所以你得到了未定义的行为。
第一次它起作用是因为你很幸运,但第二次,不知何故,内存被覆盖(函数调用经常修改堆栈,局部变量通常存储在堆栈中)。
修复:你实际上必须分配一些内存:
bool* ptrArray = malloc(size*sizeof(ptrArray[0]));
记忆具有全球寿命。除非您free
,否则无法收集。