1. ホーム
  2. c

[解決済み] C言語でメモリアドレスをprintfする方法

2022-03-04 02:28:03

質問

私のコードは

#include <stdio.h>
#include <string.h>

void main()
    {
    char string[10];
    int A = -73;
    unsigned int B = 31337;

    strcpy(string, "sample");

    // printing with different formats
    printf("[A] Dec: %d, Hex: %x, Unsigned: %u\n", A,A,A);
    printf("[B] Dec: %d, Hex: %x, Unsigned: %u\n", B,B,B);
    printf("[field width on B] 3: '%3u', 10: '%10u', '%08u'\n", B,B,B);

    // Example of unary address operator (dereferencing) and a %x
    // format string 
    printf("variable A is at address: %08x\n", &A);

linux mintのターミナルを使ってコンパイルしているのですが、gccを使ってコンパイルしようとすると、次のようなエラーメッセージが表示されます。

basicStringFormatting.c: In function ‘main’:
basicStringFormatting.c:18:2: warning: format ‘%x’ expects argument
of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("variable A is at address: %08x\n", &A);

私がやろうとしていることは、変数Aのメモリ上のアドレスを表示することです。

どのように解決するのですか?

フォーマット指定子を使用する %p :

printf("variable A is at address: %p\n", (void*)&A);


この規格では、引数の型が void* に対して %p 指定子で指定します。から printf は可変個体関数なので、暗黙のうちに void * から T * これはC言語の非変数関数では暗黙のうちに起こることです。規格を引用します。

7.21.6 書式付き入出力関数 (C11草案)

p 引数は void へのポインタでなければならない。ポインタの値は 印刷用文字のシーケンスに変換される。 実装で定義された方法で

を使用しているのに対して %x であり、これは unsigned int 一方 &Aint * . の書式指定子について読むことができます。 printfはマニュアルを参照してください。 . printf の形式指定子の不一致により 未定義の動作 .