我有以下代码,它只是打印出一个人名的介绍。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char* firstname;
char* lastname;
}Person;
void intro(void *person){
printf("The person you are looking for is %s %s\n", ((Person *)person)->firstname, ((Person *)person)->lastname);
}
int main()
{
Person *a = NULL;
a = (Person *)malloc(sizeof(Person));
char *first = NULL, *last = NULL;
first = (char *)malloc(sizeof(char)*20);
strncpy(first,"Bob", 20);
last = (char *)malloc(sizeof(char)*20);
strncpy(last,"Newmonson", 20)
a->firstname = first;
a->lastname = last;
intro(a);
return 0;
}
产生输出
The person you are looking for is Bob Newmonson
然而改变intro(a)
为intro(&a)
产生
The person you are looking for is �@ Newmonson
当我在 GDB 中打开第一次尝试并在第 10 行中断时,我找到了person=0x601010
. 名字和姓氏都存储在我期望的位置,0x04006b9
因为0x4006bd
它们在堆栈中较早声明。
当我运行 GDB 并对intro(&a)
. 的地址person
现在是0x7fffffffffdd38
,名字指向 ,0x601010
姓氏指向0x4006db
。
任何人都可以帮助解释发生了什么以及为什么我仍然可以在第二次测试中访问姓氏的正确地址。
编辑 :
正如每个人似乎一直在问这个问题void *
,这是我没有包含的这段代码的线程部分。