こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

printf()関数の括弧を二重にして、printf((~~~))とし

printf()関数の括弧を二重にして、printf((~~~))として
コンパイル/実行すると、実行時セグメンテーション違反が発生します。

コンパイル時には警告も発生しますが、このセグメンテーション違反が
なぜ起こるのか理由がよくわかりません。ご回答いただけるとありがたいです。

以下、サンプルコードと実行例です。よろしくお願いいたします。

---mytest.c----

1 #include <stdio.h>
2
3 int main(void){
4
5 //printf("test:%d", 1)ではもちろんコンパイル/実行に成功する。
6 printf(("test:%d", 1));
7 return 0;
8 }

【コンパイル/実行結果/gccバージョン】
#gcc main.c
main.c:6:警告:passing argument 1 of printf makes pointer from integer without a cast
#./a.out
セグメンテーション違反です
# gcc --version
gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27)

投稿日時 - 2010-09-07 22:35:45

QNo.6166242

暇なときに回答ください

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

printfの第1引数が("test:%d", 1)であると判断されます。
この「("test:%d", 1)」はカンマ演算子の式と解釈され、式の値は1になります。

第1引数は、文字列定数へのポインタを期待しているところに1が与えられますから、アドレス1をアクセスする結果となりセグメンテーション違反となります。

投稿日時 - 2010-09-07 22:43:12