C中的指针和分段错误?

时间:2012-01-15 15:41:44

标签: c

我是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如何解释在函数中初始化为局部变量的结构。有人可以告诉我发生了什么,谢谢!

4 个答案:

答案 0 :(得分:2)

好吧,当指针指向某个错误的时,会发生分段错误错误,而不一定是指针为空时。

您发布的代码段中没有任何错误:"bob"char*,它在程序的生命周期内保持有效,apple的返回值由值完成,所以你没有返回指向本地的指针。问题很可能出现在迭代从read()返回的苹果的代码中。

答案 1 :(得分:1)

以后阅读ap[0].name没有任何问题(其中apread()返回的指针。)

另一方面,读取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;
}