1

我大约一周前才开始学习 C,但在使用箭头运算符“->”时遇到了一些问题。我尝试在网上查找示例,但似乎没有任何帮助。这是简单的程序。

struct foo
{
    int x;
};

main(){
    struct foo t;
    struct foo* pt;

    t.x = 1;
    pt->x = 2; //here
}

当我用 gcc -o structTest structTest.c 编译它并运行它时,我总是在我用注释“here”标记的行上遇到分段错误。谁能解释为什么会这样?

谢谢!

4

4 回答 4

4

您需要初始化pt以指向某些东西!现在它只是一个的未定义指针。

尝试:

pt = &t;

例如。

于 2013-10-23T04:10:26.393 回答
3

pt永远不会被初始化。

尝试添加 pt = &t;

于 2013-10-23T04:10:49.110 回答
2

您正在尝试取消引用尚未初始化的指针(指向您有权访问的内容)。

struct foo
{
    int x;
};

main(){
    struct foo t; // this is an instance of foo
    struct foo* pt; // this is a pointer to a foo

    t.x = 1; // you can set the contents of foo
    pt->x = 2; // you can't de-reference an un-initialized pointer
}

要解决问题:

struct foo
{
    int x;
};

main(){
    struct foo t;
    struct foo* pt;

    t.x = 1;
    pt = &t; // make your pointer point to an instance of foo
    pt->x = 2; // this is ok now (this modifies the contents of 't')
}
于 2013-10-23T04:13:16.103 回答
1

您必须将指针视为一种两部分的东西。第一部分是指针本身:

struct foo* pt;

指针的另一部分是它所指向的东西。上面代码的问题是您的指针没有指向任何东西。

使指针指向某物的方法是对其进行初始化。有几种方法可以做到这一点。您的指针必须始终指向指针目标类型的有效实例,然后才能取消引用它(使用 -> 或 * 运算符)。

pt = new foo(); // one way to initialize your pointer by pointing it to newly allocated dynamic memory
pt = &t; // another way, by pointing it to the address of a local variable

void bar(foo *x)
{
    pt = x; // another way, by assigning it to another pointer
}

bar(new foo());

在初始化指针之前,它处于悬空状态(“悬空指针”)。你不能取消引用它,因为它没有指向任何有效的东西。通常,如果您这样做,您的程序会崩溃,但它可能有许多其他有趣的行为。

要修复你的程序,你必须pt指出一些有效的东西。我不知道你的程序的最终目标是什么,所以你必须做出决定,但希望我已经提供了足够的线索。

于 2013-10-23T04:18:19.277 回答