【问题标题】:dereferencing pointer to incomplete type when accessing members of a struct pointer访问结构指针的成员时取消引用指向不完整类型的指针
【发布时间】:2014-05-09 22:50:32
【问题描述】:

我有以下示例代码:

人.h

typedef struct person Person;
Person* makePerson(char* n, int i);

person.c

#include "person.h"
struct person {
    char* name;
    int age;
};

Person* makePerson(char* n, int i) {
    Person person;
    person.name = n;
    person.age = i;
    return &person;
}

main.c

#include <stdio.h>
#include "person.h"
int main() {
    Person* pp = makePerson("Mark",24);
    printf("Person's name : %s\t Person's age : %d\n",pp->name, pp->age);
}

当我尝试打印出与 Person 指针 pp 对应的姓名和年龄成员时,出现“取消引用指向不完整类型的指针”的错误。

我正在使用 gcc-std=c99 -o main main.c person.c 来编译

谁能给我一些指导?谢谢

【问题讨论】:

  • 是的,您正在尝试访问main.c 中的nameage,但它对它们一无所知,因为定义在person.c 中。您应该将结构定义移动到头文件中。
  • 永远不要将局部变量指针返回给它的调用者:return &person;
  • 仅供参考,您应该在 makePerson 中使用 malloc 并返回指针。如果你只是这样声明局部变量,它将在 makePerson 函数调用结束时消失,这会使你的指针指向一个不安全使用的内存
  • 如果您定义了一个结构标签和一个类型名称,请考虑为两者使用完全相同的名称。这让每个人都变得更简单,甚至可以让你的代码也成为有效的 C++。
  • 谢谢大家。我将重写 makePerson 以使用 malloc。是否可以在 .c 文件中有“完全可访问”的定义,或者所有内容都必须在 .h 文件中?

标签: c pointers struct dereference


【解决方案1】:

这一行:

printf("人名:%s\t 人年龄:%d\n",pp->name, pp->age);

取消引用person 结构。但是,您的 .h 文件仅包含前向声明。

要么将打印功能放入person.c,要么将完整的struct 定义移至person.h

【讨论】:

  • 谢谢,问题已在 cmets 中解决,但您是第一个真正给出答案的人
猜你喜欢
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2013-12-22
  • 2014-07-06
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多