ADT 的分段错误
Posted
技术标签:
【中文标题】ADT 的分段错误【英文标题】:Segmentation fault with ADT 【发布时间】:2015-10-13 16:22:16 【问题描述】:这给了我一个分段错误错误。任何想法为什么?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
int *items;
int length;
IntArray;
void init(IntArray *I)
// I->length = 0;
I->items = (int *) malloc(sizeof(int) * 5);
I->items[0] = 1;
int main()
IntArray *i;
init(i);
return 0;
我认为除了在 main 中声明 IntArray 之外,我可能做的一切都是正确的,但不确定我是如何做到的
【问题讨论】:
【参考方案1】:这里:
int main()
IntArray *i; // uninitialised pointer
init(i);
return 0;
i
未初始化。它没有指向任何地方。当您将此指针传递给init
并通过i->items
取消引用它时,您会遇到分段违规。
你可以创建一个结构对象并传递它的地址,而不是创建一个指针:
int main()
IntArray i; // uninitialised object
init(&i); // valid address to said object
return 0;
对象本身也未初始化,即其字段包含垃圾,但您将在 init
中修复它。
【讨论】:
谢谢你,解决了。我有一种感觉,这是错误,但刚接触 C 语言时我感到很困惑。【参考方案2】:传递给init(IntArray *I)
的参数i
在函数调用之前没有在main()
中定义,导致分配I->items
时出现未定义的行为。
在这种情况下,未定义的行为意味着您的段错误。
【讨论】:
以上是关于ADT 的分段错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?