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