gpt4 book ai didi

c - 两次打印数组元素会导致段错误

转载 作者:行者123 更新时间:2023-11-30 19:11:03 25 4
gpt4 key购买 nike

我正在尝试在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

为什么会发生这种情况?

最佳答案

问题出在generateMatrix

这里:

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

您正在使用局部变量的引用,该变量的生命周期仅限于函数调用,但您将其存储在返回对象中。

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

第一次它可以工作,因为你很幸运,但第二次,内存以某种方式被覆盖(函数调用经常修改堆栈,局部变量通常存储在堆栈上)。

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

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

该内存具有全局生命周期。除非您释放,否则无法收集。

关于c - 两次打印数组元素会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40709143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com