应该 return 一个指针但编译正常
Supposed to return a pointer but compiles fine
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
就像一个构造函数,它应该 return 一个指向新分配的人的指针,如果我在 New_Person
函数中注释 return 语句我仍然得到相同的行为,有人可以向我解释为什么它在没有 return 语句的情况下编译并给出相同的行为吗?
我有同样的行为,所以我反汇编了你的构造函数:
0000000000000000 <New_Person>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 20 sub [=10=]x20,%rsp
8: 89 7d ec mov %edi,-0x14(%rbp)
b: 48 89 75 e0 mov %rsi,-0x20(%rbp)
f: bf 10 00 00 00 mov [=10=]x10,%edi
14: e8 00 00 00 00 callq 19 <New_Person+0x19>
19: 48 89 45 f8 mov %rax,-0x8(%rbp)
1d: 48 8b 45 f8 mov -0x8(%rbp),%rax
21: 8b 55 ec mov -0x14(%rbp),%edx
24: 89 10 mov %edx,(%rax)
26: 48 8b 45 f8 mov -0x8(%rbp),%rax
2a: 48 8b 55 e0 mov -0x20(%rbp),%rdx
2e: 48 89 50 08 mov %rdx,0x8(%rax)
32: c9 leaveq
33: c3 retq
看起来您的指针存储在 rax
寄存器中,该寄存器恰好是存储函数 return 值的寄存器(对于整数和指针类型)。
你的行为是未定义的。
main()
中的指针 p
永远不会在函数 New_person()
没有 return 的情况下进行初始化。所以使用未初始化的变量会导致未定义的行为。
您正在堆上分配一些内存,并且 main()
中的指针 p
永远不知道由 malloc() 编辑的地址 return。所以你正在访问一些随机内存,幸运的是,随机内存是你在堆上分配的内存。
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
就像一个构造函数,它应该 return 一个指向新分配的人的指针,如果我在 New_Person
函数中注释 return 语句我仍然得到相同的行为,有人可以向我解释为什么它在没有 return 语句的情况下编译并给出相同的行为吗?
我有同样的行为,所以我反汇编了你的构造函数:
0000000000000000 <New_Person>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 20 sub [=10=]x20,%rsp
8: 89 7d ec mov %edi,-0x14(%rbp)
b: 48 89 75 e0 mov %rsi,-0x20(%rbp)
f: bf 10 00 00 00 mov [=10=]x10,%edi
14: e8 00 00 00 00 callq 19 <New_Person+0x19>
19: 48 89 45 f8 mov %rax,-0x8(%rbp)
1d: 48 8b 45 f8 mov -0x8(%rbp),%rax
21: 8b 55 ec mov -0x14(%rbp),%edx
24: 89 10 mov %edx,(%rax)
26: 48 8b 45 f8 mov -0x8(%rbp),%rax
2a: 48 8b 55 e0 mov -0x20(%rbp),%rdx
2e: 48 89 50 08 mov %rdx,0x8(%rax)
32: c9 leaveq
33: c3 retq
看起来您的指针存储在 rax
寄存器中,该寄存器恰好是存储函数 return 值的寄存器(对于整数和指针类型)。
你的行为是未定义的。
main()
中的指针 p
永远不会在函数 New_person()
没有 return 的情况下进行初始化。所以使用未初始化的变量会导致未定义的行为。
您正在堆上分配一些内存,并且 main()
中的指针 p
永远不知道由 malloc() 编辑的地址 return。所以你正在访问一些随机内存,幸运的是,随机内存是你在堆上分配的内存。