gpt4 book ai didi

c - 返回指向结构的指针后出现段错误

转载 作者:太空狗 更新时间:2023-10-29 15:57:33 25 4
gpt4 key购买 nike

有从文件中读取并返回结构的程序。

struct ion_bin
{
int freq;
long height;
int amplitude;
};

//Dynamic auto allocating array
typedef struct {
struct ion_bin *array;
size_t used;
size_t size;
} Ionogram;

void freeArray(Ionogram *a); //free memory
void insertArray(Ionogram *a, struct ion_bin element); //realloc memory
void initArray(Ionogram *a, size_t initialSize); //malloc memory

Ionogram* read(int argn, char* argv[])
{
FILE* stream;
Ionogram ionogramObj;

//fill ionogram from file by initArray and insertArray
//.....

return &ionogramObj;
}

int main(int argn, char* argv[])
{
Ionogram* r = read(argn, argv);

fprintf(stderr,"Array size: %d Used %d\n",r->size, r->used); //SEGMENTATION FAULT ERROR
//int second = (*(r->array + 2)).amplitude; //YET SEGMENTATION FAULT ERROR TOO

//fprintf(stderr, "%d", second);
return 0;
}

此程序编译成功,但在运行时和调试中通过尝试获取返回结构的字段(在 main 方法中)触发段错误错误 (SIGSEGV) 如何修复此错误?

最佳答案

你犯了初学者的错误,返回了一个指向局部变量的指针。您必须记住,一旦函数返回,局部变量就会超出范围,然后指向它的指针将变得无效。取消引用此无效指针会导致未定义的行为

两种可能的解决方案:

  1. 实际上按值返回结构,而不是指针。
  2. 使用 malloc 为结构分配内存,并返回指向此动态分配内存的指针。

方法一适用于较小的结构,例如您的结构,但对于较大的结构效率低下,因为必须复制整个结构。 (虽然这是一个拷贝,而不是深拷贝。所以如果你在结构中有指针,只会复制指针,而不是它们指向的内容。)

关于c - 返回指向结构的指针后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32048392/

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