【问题标题】:How to pass a struct pointer variable as argument in order to edit it in C如何将结构指针变量作为参数传递,以便在 C 中对其进行编辑
【发布时间】:2014-01-04 17:40:38
【问题描述】:

C语言

如何将结构指针变量作为参数发送给将要编辑该结构变量的函数?

我在单独的头文件中有以下结构:

typedef struct {
    unsigned int id;
    unsigned int value;
} type1;

typedef struct {
    unsigned int id;
    type1 children[32];
    unsigned int numChildren;
} person;

我希望能够做到这一点:

void person_editID(person *p, unsigned int newID) {
    p->id = newID;
}

在这个:

void function2() {
    person *p;
    person_editID(p,2);
    printf("Person ID: %d\n",p->id);
    person_editID(p,4);
    printf("Person ID: %d\n",p->id);
}

(这两个函数在不同的文件中)

并得到结果:

Person ID: 2
Person ID: 4

但是上面的代码有一个错误:

SIGSEGV... 错误地址 0x0 (dataseg); err 0x6 nopage write ...

是不是因为function2 p 没有初始化?如果是这样,我该如何初始化它?

【问题讨论】:

    标签: c pointers struct arguments argument-passing


    【解决方案1】:

    改变这个:

    person *p;
    

    到这里:

    person p;
    

    还有这个:

    person_editID(p,2);
    

    到这里:

    person_editID(&p,2);
    

    【讨论】:

    • @Edu:不,这在 C++ 中也同样不正确——初始化的指针在任何一种语言中都是初始化的指针。在 C++ 中,您可以选择使用 person& 类型,但仅此一项不会使您的代码正确。
    • @Edu:您混淆了指向实际结构的指针。你声明了一个 NULL 指针(一个还没有指向任何东西的指针)person *p; &p这样传递它,你不是传递结构,而是将结构的地址传递给函数,有效地传递一个指针
    • @EliasVanOotegem:更糟糕的是,它是一个未初始化的指针,而不是一个 NULL 指针。
    • @Clifford:确实如此,对于 OP:如果您没有初始化指向 实际上 指向内存地址的指针,请将其初始化为 NULL,以避免可能的free 错误。初始化一个指向NULL 的指针可能感觉很傻,但至少它是安全的。把它想象成一件 Hi-vis 夹克
    • 谢谢大家的解释。这说得通。我正在创建一个指向无处的指针,这就是发生错误的原因(也许这就是它打印“0x0”,没有地址的原因)。我的疑问是如何发送地址。我创建结构并使用 & 传递地址。再次感谢您的快速帮助。 :)
    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多