나는 사람 이름의 소개를 단순히 인쇄하는 다음 코드를 가지고 있습니다. 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
그러나 내가 GDB의 첫 번째 시도를 열고 난을 찾을 라인 (10)에 침입하면 intro(&a)
-intro(a)
이
The person you are looking for is �@ Newmonson
을 생산 변화의 출력을 생성합니다 주소는 person=0x601010
입니다. 이름과 성은 모두 내가 기대할 수있는 위치에 저장됩니다 (0x04006b9
및 0x4006bd
).
나는 GDB를 실행하여 변경된 내용을 intro(&a)
으로 변경했습니다. person
의 주소는 이제 0x7fffffffffdd38
이며, 이름은 0x601010
이고 성은 0x4006db
입니다.
아무도 무슨 일이 일어나고 있는지, 왜 두 번째 테스트에서성에 대한 적절한 주소에 계속 액세스 할 수 있는지 설명 할 수 있습니까?
편집 : 모든 사람으로
이 그것을 void *
내가 포함되지 않은이 코드의 나사 부분에 대한이었다에 대해 물어 유지할 것으로 보인다.
참고 :'첫번째 = (숯불 *) malloc을 (를 sizeof (숯불) * 20); first = "Bob"; '당신이하고 있다고 생각하는 것을하지 않습니다. –
또한'intro()'와 함께 작업하기를 희망하는 유일한 것이'Person *'일 때'int *()'를'void *'라고 취하는 이유는 무엇입니까? –
@MichaelBurr 연습을 위해'void * '를 사용하고 싶었지만 대신이 문제가 발생했습니다. – Blackninja543