加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间: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)如何修复此错误?

解决方法

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

两种可能的解决方

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读