2012-03-10 14 views
0

これは私のCコードです:実行すると予期しないCコード出力

#include <stdio.h> 


int main(){ 

int x[] = {6,1,2,3,4,5}; 
int *p=0; 
p =&x[0]; 


while(*p!='\0'){ 

    printf("%d",*p); 
    p++; 
} 

return 0; 


} 

出力が612345から448304448336

数字はマイナス記号の後に、なぜ私のコードは、これを与えているどのようなものがありますか?

答えて

2

*p != 0と同じである条件*p != '\0'は、会ったことはありませんので、あなたは、配列の境界をオーバーラン定義されていない動作に入る

代わりに、あなたは、配列を制御する必要がありますが、直接範囲:Cで

for (int const * p = x; p != x + sizeof(x)/sizeof(x[0]); ++p) // or "p != x + 6" 
{ 
    printf("%d", *p); 
} 
1

\0が発生するまでループを実行しますが、配列は決して\0で終了しませんでした。

int x[] = {6,1,2,3,4,5}; 

は、\0が終了していない配列を作成します。最後の要素として、\0を明示的に追加する必要があります。

配列が\0で終了していないため、が発生するまでwhile()ループが実行されます。技術的には、これは未定義の動作です。これは、変数に割り当てられていないメモリの内容を読み込んでいるためです。

推奨する解決方法:お使いのアレイに値0の要素が含まれていないため

int x[] = {6,1,2,3,4,5,0}; 

while(*p != 0) 
0

配列はNULL終端ではありません。これはあなたのループが宣言された配列の終わりを超えてしまう理由です。 5の数字は、そのメモリ空間に何が起こってもまったく同じです。配列の割り当てに続いてヌル文字がない場合、ループはSegFaultを作成するまで実行を継続します。

+0

'char'配列はNULLで終了します。 –

+0

@ NiklasB。あなたが特に "コンテンツ"でそれらを宣言するか、\ 0を最後に追加することによってそれらを終わらせることができます。 char [10]を宣言すると、char [9]またはchar [10]がヌル文字であるという保証はありません。 int x []をchar x []に置き換えると、次のように表示されます。 – RussS

+0

@Niklas B .:いいえ、*の文字列があります。 – DarkDust