我是C的新手,所以请在这个问题中纠正任何问题,而且我的问题也可能太模糊了。我有这样的代码,我得到一个分段错误。我在网上看到,当你访问指向什么的指针
时,通常会发生分段错误struct apple get(char* name) {
struct apple a;
a.name = name;
return a;
}
struct apple* read(){
struct apple* ap = (struct apple*)malloc(2*sizeof(struct apple));
ap[0] = get("bob");
return ap;
}
// loop through in another function which reads a pointer to an
// apple object in the array and then accesses apple->name
当它访问apple-> name时存在分段错误。我假设这是因为苹果对象被声明为局部变量,后来由c ???释放我真的不知道为什么我会出现分段错误或如何修复它或者c如何解释在函数中初始化为局部变量的结构。有人可以告诉我发生了什么,谢谢!
答案 0 :(得分:2)
好吧,当指针指向某个错误的时,会发生分段错误错误,而不一定是指针为空时。
您发布的代码段中没有任何错误:"bob"
是char*
,它在程序的生命周期内保持有效,apple
的返回值由值完成,所以你没有返回指向本地的指针。问题很可能出现在迭代从read()
返回的苹果的代码中。
答案 1 :(得分:1)
以后阅读ap[0].name
没有任何问题(其中ap
是read()
返回的指针。)
另一方面,读取ap[1].name
是未定义的行为,因为您从未初始化它。
此外,不允许修改ap[0].name
指向的字符串,因为它指向字符串文字。
答案 2 :(得分:0)
我猜你试图改变字符串。在C中,字符串文字应该是只读的,并且尝试更改它们是未定义的行为。如果您希望a.name不是只读的,则可以使用strdup。 (别忘了释放它)
答案 3 :(得分:0)
我自己对C不太熟悉,但是我可以冒着被大量投票的风险来回答它。
我认为问题是你在错误的地方分配堆上的内存。据我所知,您的意图是get
返回一个带有提供名称的新apple
结构?在这种情况下,您应该使用get
方法分配内存,然后返回struct apple *
。所以喜欢:
struct apple *get(char* name) {
struct apple *ap = (struct apple *) malloc(sizeof(struct apple));
ap->name = name;
return ap;
}