我有下面的代码,它只是打印出一个人的名字的介绍。C指针参考
#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 *
是这个代码,我没有包括的螺纹部分。
FYI:'第一=(的char *)malloc的(的sizeof(char)的* 20);第一个=“鲍勃”;“没有做你认为正在做的事情。 –
另外,为什么当声明'intro()'是否只有一个''* *'的时候,有一个希望与它一起工作的'void *'? –
@MichaelBurr我想用'void *'来进行练习,但碰到了这个问题。 – Blackninja543