【发布时间】:2015-03-05 14:11:35
【问题描述】:
typedef struct person {
int id;
char* name;
} Person;
//constructor like function
Person* New_Person(int id,char *name){
Person* p = malloc(sizeof(Person));
p->id = id;
p->name = name;
//return p;
}
int main(){
for(int i=0;i<10;i++){
Person* p = New_Person(i,"abcd");
printf("id:%d name:%s \n",p->id,p->name);
}
printf("DONE\n");
return 0;
}
New_Person 就像一个构造函数,它应该返回一个指向新分配的人的指针,如果我在 New_Person 函数中注释 return 语句,我仍然会得到相同的行为,有人可以解释一下为什么在没有返回语句的情况下编译并给出相同的行为?
【问题讨论】:
-
您很幸运,因为您的代码中存在未定义的行为,从而获得了预期的输出。我怀疑编译器是如何没有发出警告说你没有从函数中返回的……
-
@Gopi 我真的不明白我不小心忘记了 return 声明,它仍然有效
-
寻找“未定义的行为”。这意味着,任何事情都可能发生,编译器不需要告诉你。使用不返回的函数的返回值是未定义的。使用适当的警告设置会捕获一些实例(例如,
-Wall在此处使用 gcc)。 -
@mafso 感谢 -Wall 现在我收到警告