问题描述:
数据结构作业中,写了一个初始化表的函数:
#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);



