2016-04-02 10 views
1

は、私はその上でグーグルをした、と私はいくつかは、それはいくつかは、それができないと言う ことができると言うことに気づきました。文字列リテラルのアドレスを出力できますか?

私はちょうど検証したいと思います。例えば

char gchararr1i[] = "testing 123"; // global char array init 
char *gptr1i = "hello", *gptr2ui; // global char pointer init and un-init 
float gfloati = 123.4; // global float var init 
double gdoubleui; // global double var un-int 


int main(int argc, char *argv[]) { 

    printf("\n Address of string literals \"testing 123\" = %p and \"hello\" = %p \n", gchararr1i, gptr1i);// output the addresses of string literals "testing 123" and "hello" 

    f1(10, -20, 30.3, 'A', 45.67); 
    exit(0);    
} 
+1

これは可能ですが、技術的にはポインタを 'void *'にキャストする必要があります。 – user3386109

+0

void *へのポインタをキャストするだけでどういう意味ですか?とにかく、それが可能なら、私が印刷した方法は正しいのですか? –

+1

など。 'printf(" address =%p \ n "、(void *)gchararr1i);' C仕様では、 '%p' *の引数は' void * 'でなければならないと書かれていますが、 。 – user3386109

答えて

4

は、我々は文字列リテラルのアドレスをプリントアウトすることができますか?

はい。文字列リテラルのアドレスを簡単に出力する例です。 gchararr1i[]の最初の要素のアドレスアウト

printf("%p\n", (void *) "Hello Word!"); 

出力

0x100403055 

次のプリント。これは、文字列リテラルのアドレスであってもなくてもよい。文字列リテラルは、コード内に別々に存在しないことさえあります。

char gchararr1i[] = "testing 123"; 
printf("%p\n", (void *) gchararr1i); 

出力

0x22caa0 

"hello"リテラル文字列のアドレスであることを起こるポインタgptr1iのアドレス値アウト次のプリント。

char *gptr1i = "hello"; 
printf("%p\n", (void *) gptr1i); 

出力

0x100403060 

-

詳細:"%pのみvoid*ポインタを印刷して定義されます。 void*以外のオブジェクトのポインタを印刷するとき、最初のvoid *にキャスト。 @user3386109。注:関数ポインタを出力するにはthisを参照してください。

int x; 
// printf("%p\n", x); 
printf("%p\n", (void *)&x); 
+0

私はいつも%pがポインタのアドレスを表示するのに使うと考えています。いいえ? –

+0

''%p "'は 'void *'ポインタを表示するためだけです。関数へのポインタを除くすべてのポインタは、すぐに 'void *'に変換されます。だから、 'void *'へのポインタをキャストすることは堅牢なコードアプローチです。 _Many_実装は、キャストを省略した場合でも同じ結果を返しますが、それは堅牢なコードではなく、_technically_は未定義の動作です。 – chux

+0

なぜ*「技術的に」* UBですか?それについては不明な点は何もない。 –

7

あなたは文字列リテラルのアドレスを取ることができますが、まったく同じ内容の2つの文字列リテラルは、同じアドレスになることを確信することができない(あるいはそれらが同じアドレスを持っていないことを)。コンパイラツールチェーンは、その点で望むように自由に行うことができます。

標準であっても、別でメモリを共有するために1つの文字列リテラルを許可します。たとえば、"world"のアドレスは、文字「"hello world"」を指すことがあります。私はこれを行う実装を認識していませんが、私はそれもチェックしていません。

関連する問題