返回指向结构的指针后出现分段错误
发布时间:2020-12-16 09:58:44 所属栏目:百科 来源:网络整理
导读:有从文件读取的程序并返回结构. struct ion_bin{ int freq; long height; int amplitude;};//Dynamic auto allocating arraytypedef struct { struct ion_bin *array; size_t used; size_t size;} Ionogram;void freeArray(Ionogram *a); //free memoryvoid
有从文件读取的程序并返回结构.
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 %dn",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)如何修复此错误? 解决方法
你让初学者犯了错误,并返回一个指向局部变量的指针.你必须记住,一旦函数返回,局部变量就会超出范围,并且指向它的指针将变为无效.取消引用此无效指针会导致未定义的行为.
两种可能的解决方 >实际上按值返回结构,而不是指针. 方法一适用于较小的结构,如您的,但对于较大的结构效率低,因为必须复制整个结构. (虽然这是一个浅层副本,但不是深层副本.所以如果你在结构中有指针,只会复制指针而不是它们所指向的指针.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |