次のコードは、人の名前の紹介を単純に出力したものです。
#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
ます。
誰かが何が起こっているのか、そしてなぜ私が2番目のテストで姓の正しいアドレスにアクセスできるのかを説明するのを手伝ってもらえますか?
編集 :
誰もがそれについて尋ね続けているように見えるのでvoid *
、私が含めなかったこのコードのスレッド部分のためでした。