2012-01-16 16 views
0

これをコンピュータで実行すると、コンパイルエラーが発生します。しかし、インターネットで見つけたチュートリアルからそのままコピーしました。ポインタでCプログラムをコンパイルするとエラーが発生する

#include <stdio.h> 
#include <conio.h> 

void main(){ 
    int i = 9; 
    clrscr(); 

    printf("The value of i is: %d\n", i); 
    printf("The address of i is: %u\n", &i); 
    printf("The value at the address of i is: %d\n", *(&i)); 

    getch(); 
} 

エラー:

$ cc "-Wall" -g ptrex6.c -o ptrex6 
ptrex6.c:7:19: error: conio.h: No such file or directory 
ptrex6.c:9: warning: return type of ‘main’ is not ‘int’ 
ptrex6.c: In function ‘main’: 
ptrex6.c:11: warning: implicit declaration of function ‘clrscr’ 
ptrex6.c:14: warning: format ‘%u’ expects type ‘unsigned int’, but argument 2 has type ‘int *’ 
ptrex6.c:17: warning: implicit declaration of function ‘getch’ 
make: *** [ptrex6] Error 1 
+16

*チュートリアルを捨てる* '無効メイン()'、それはあなたに複数の問題を指摘されたとしてあなたは、エラーメッセージをお読みくださいC. –

+3

有効ではありません: ' main'は 'int main()'ではなく 'int main()'として宣言されるべきです。あなたのインクルードパスは 'conio.h 'が見つからないので間違っているようです。あなたの書式が間違っています - ポインタ値が符号なし整数( '%u')ではないので、おそらく'%p'を代わりに使います。 – bobbymcr

+1

ConIOはdosライブラリですが、これをどのようなマシンでコンパイルしていますか? – Kevin

答えて

7

間違い:

  1. conio.h標準Cはありませんヘッダ。システム上で使用できない可能性があります。それにもかかわらず、printf()では必要ありません。だからこそstdio.hがここにいるのです。それを削除し、clrscr()も削除します。これは、conioライブラリなしでは動作しません。こうすることで、ファイルをコンパイルすることができます。他のメッセージはエラーではなく「単なる」警告であるためです。

  2. main()関数の戻り値の型をintに変更し、0を返します。これがC標準の仕様です。 これが欲しいです。

  3. %uの代わりに%dフォーマット指定子を使用してください。コンパイラのメッセージが直接指摘しているように、%uは符号なし整数で、intは明示的に署名されています。整数> = 2^31の場合、奇妙な動作の問題が発生します。

  4. 間違った指定子をもう一度使用しています。 %u /%d /ではなく、アドレス/ポインタには%pを使用してください。

  5. チュートリアルから明示的に信じる/コピー・ペーストしないでください。チュートリアルはコピー貼り付けではなく、思考して学ぶべきものです。

+0

'main'の最後のreturn文は必須ではありませんので、私は間違いと呼んでいません。 – ouah

+0

私はあなたがそれを使用しないとvoid以外の関数からvoidを返すのに慣れてしまうでしょう。そして、それらはコンパイラによって修正されません(main()から戻らない場合はcrt0と同じです)それらは**クラッシュします**。 –

+0

私はあなたの提案を行い、getch()をgetchar()に変更しました。今私はエラーが少なくなっています。 – userend

3

ここでは、Cでポインタ値を印刷する方法である:

printf("The address of i is: %p\n", (void *) &i); 
+0

質問ではありませんでした。 –

2

Wikipedia

により述べたようにconio.hテキスト ユーザインタフェースを作成する古いMS-DOSコンパイラで使用されるCヘッダファイルです。 Cプログラミング言語 の本には記載されておらず、C標準ライブラリISO Cの一部ではないであり、 はPOSIXで定義されていません。

4

かなり古い本/例を使用しているに違いありません。 conio.hファイルはMS-DOSシステムで使用されていました。あなたのコードは次のようになります。

#include <stdio.h> 

int main() 
{ 
    int i = 9; 

    printf("The value of i is: %d\n", i); 
    printf("The address of i is: %p\n", (void*)&i); 
} 
+2

'&i'は' void * 'にキャストされなければなりません。そうでなければ未定義の動作です。 – ouah

+0

あなたはそうです!ごめんなさい。 – Mithrandir

+0

clrscr()関数についてはどうですか? – userend

関連する問題