2016-04-01 5 views
-1
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    printf("Hello world!\n"); 
    printf("a"+14); 

    printf("tera kya hoga kalia \n\n"); 

    return 0; 
} 

//このコードを印刷なぜC言語で次のような警告行が次の行の文字列と印刷をしているのですか?

こんにちは、世界!

カリア

テラKYAのHOGAのカリア

//なぜそれが次の行の印字データを取っています。

// Yes new to C !!!

+3

オブジェクトの境界を超えてポインタ演算を計算する未定義の動作。 C11仮標準n1570 * 6.5.6加算演算子8 [...]ポインタのオペランドと結果の両方が同じ配列オブジェクトの要素を指す場合、または配列オブジェクトの最後の要素を指す場合、評価ではオーバーフロー;それ以外の場合、動作は未定義です。* – EOF

答えて

2

ライン:

char const* s1 = "a"; 
char const* s2 = s1 + 14; 
printf(s2); 

発現s1 + 14が無効なポインタに評価:

printf("a"+14); 

はquivalentにあります。 s1の値が与えられると、s1+0s1+1が有効なポインタになります。

s2が無効なポインタであるので、

printf(s2); 

ラインは、未定義の動作の原因です。実際に

は、s1の値が与えられ、単に計算s1+iはすべてi < 0i > 2のための未定義の動作です。

EOFさんのコメントから:

6.5.6添加剤事業者8 [...]ポインタオペランドと結果のポイント同じ配列オブジェクトの要素に、またはの最後の要素過去1両方の場合配列オブジェクトである場合、評価はオーバーフローを生じてはならない。それ以外の場合、動作は未定義です。

+0

定義されていない動作は、追加によって開始されます。 'printf()'が未定義の動作をする必要はありません。 @EOF、確かに – EOF

+0

。それを指摘してくれてありがとう。 –

関連する問題