-1

以下のコードがまだ機能する理由を誰が教えてくれますか? str[4] が境界外であることは明らかです。

#include<stdio.h>
int main(){
    char str[3];
    scanf("%s", str);
    printf("%c\n", str[4]);
    printf("%s\n", str);
    return 0;
}

実行時に と入力するabcdefgと、5 番目の文字と文字列全体がエコーされますが、何も問題はありません。

c/c++ は境界チェックを行わないと宣言されていますが、上記の場合、printf を使用してユーザーが入力した c-string を出力するにはどうすればよいですか? またはより一般的には、ユーザーからの c-string を適切に使用する方法は?

4

3 に答える 3

2

str[4] は、文字列の最後の要素の後のメモリ アドレスへのポインターを提供します。これを文字に変換することはできますが、何が得られるか分からず、ソフトウェアがクラッシュする可能性があります。

于 2013-03-02T16:51:54.230 に答える
1

なぜそれが機能するのですか?

それは「うまくいきません」。ただし、機能しているように見えるかもしれません。コード (範囲外の配列にアクセスする) は未定義の動作を呼び出すため、文字通り任意の結果を得ることができます。未定義の動作は、「クラッシュする必要がある」という意味ではありません。

于 2013-03-02T16:53:56.093 に答える
0

あなたが書いた:

実行時に[abcdefg]と入力すると、5番目の文字と文字列全体がエコーされますが、何も問題はありません。

しかし、あなたが投稿したコードには入力の読み取りがありません:

#include<stdio.h>
int main(){
    char str[3];
    printf("%c\n", str[4]);
    printf("%s\n", str);
    return 0;
}

いずれにせよ、 はから始まるstr[4]5 番目char(バイト)を指すためstr、プログラムの実行時にそのメモリ位置にある「ガベージ」が出力されます。

範囲外の配列項目へのアクセスは未定義の動作であるため、正確な動作は指定されていません。配列の境界に注意してください。

于 2013-03-02T17:16:07.783 に答える