栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 引用自定义类型为参数时报错Segmentation fault

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 引用自定义类型为参数时报错Segmentation fault

问题描述:

数据结构作业中,写了一个初始化表的函数:

#define InitSize 100
#define ElemType int

typedef struct {
    ElemType* list;
    int len;
    int size;
} sql_;


int sql_init(sql_ *head) {
    (*head).list = (ElemType*)malloc(InitSize*sizeof(ElemType));
    (*head).len = 0;
    (*head).size = InitSize;

    return 1;
}

int main() {
    sql_ L1;
    sql_init(&L1);

    sql_*L2;
    sql_init(L2);

    system("pause");
}

但运行时却报错:Segmentation fault

 进入调试界面发现L1成功初始化了,但到L2时就出了问题,那么L1和L2初始化的代码有什么不同呢?

分析问题:

    sql_ L1;
    sql_init(&L1);

    sql_*L2;
    sql_init(L2);

可见L1被声明为 sql_类型;而L2却被声明成sql*_类型。

vscode中并未给出警告,但在vs2019中却警告并报错甚至不能通过编译。那么原因如何呢?

通过网络检索,得到这样一篇文章:C++中int *a; int &a; int & *a; int * &a_天涯明月刀的博客-CSDN博客

收到文中提到的引用的概念的启发,做了如下尝试:

sql_ L;
    sql_*L2 = &L;
    sql_init(L2);

 如此处理过后可以顺利完成初始化,因此做出如下猜测:

在宏定义类型时,只声明了:sql_类型,而对sql_*类型没有声明,因此main中声明 sql_ * L1;时,编译器是找不到原型的,所以声明传参时无法也就引用sql_*类型,所以vs相对更严格的编译器发现了这个问题,并告知L2的内存无法分配。

解决方法:

用预定义过的sql_类型声明,需要传参时使用他的引用&L作为sql_*类型的实参也就是文初提到的初始化L1的方法:

    sql_ L1;
    sql_init(&L1);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291201.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号