web-dev-qa-db-ja.com

printfで構造のアドレスを確認する方法

次のようにアドレスを返す関数があります

_struct node *create_node(int data)
{
        struct node *temp;
        temp = (struct node *)malloc(sizeof(struct node));
        temp->data=data;
        temp->next=NULL;
        printf("create node temp->data=%d\n",temp->data);
        return temp;
}
_

ここで、structnodeは

_struct node {
        int data;
        struct node *next;
};
_

Tempに保存されているアドレスをprintf( "")で確認するにはどうすればよいですか?

[〜#〜]更新[〜#〜]
gdbでアドレス指定されていることを確認すると、アドレスは16進数形式、つまり0x602010で送信されます。ここで、printf("%p",temp)の同じアドレスは、gdbprintで表示されたものとは異なる番号で送信されます。コマンド。

18
Registered User

ポインタアドレス形式指定子を使用します%p

printf("Address: %p\n", (void *)temp);
28
jv42

編集:これを行わないでください!必要なものではなく、ポインタのアドレスを出力します!

これを機能させるのにあらゆる種類の問題がありましたが、コンパイラ(単純な「cc」unixコマンドラインを使用)が文句を言わず、適切な結果が得られたようです。

struct node temp;
// ... whatever ...
printf ("the address is %p", &temp);

[削除するのではなく、これをしてはいけないことの例として残しました。 -smb]

2
Scott Biggs
enter code here

#include<stdio.h>
struct anywhere
{ 
double a;
int b;
char c;
float d;
}g;
int main()
{
printf("%p\n%p\n%p\n%p\n",&g.a,&g.b,&g.c,&g.d);
return 0
}        

出力を取得できるようになりました:g.aのアドレス

このように構造体変数のアドレスを出力できます。また、各メンバーのアドレスを出力することで、構造体でパディングがどのように発生するかを確認できます。

すべての間違いと提案に感謝しますpingコメントしてください。

0
satish