web-dev-qa-db-ja.com

すべてのchar配列は自動的にnullで終了しますか?

おそらく私はグーグルするにはあまりにもダンプしすぎていますが、char配列はリテラルの初期化(char x[]="asdf";)そして、これが当てはまらないように見えるのを見て少し驚いた。

int main()
{
    char x[2];
    printf("%d", x[2]);
    return 0;
}

出力:0

Size = 2 * charとして宣言された配列は、実際には2文字のサイズを取得するべきではありませんか?それとも私はここで何か間違ったことをしていますか?文字列としてではなく、単純な文字配列としてchar配列を使用することは珍しいことではありませんか?

11
user1329846

境界外の初期化されていない配列にアクセスしています。それは二重です未定義の振る舞い、出力として0を取得しても、何かが起こる可能性があります。

あなたの本当の質問への答え:文字列リテラルだけがnullで終了するを取得します。つまり、char x[]="asdf"5要素の配列です。

22
K-ballo

char配列はnot自動的にNULLで終了し、文字列リテラルのみです。 char *myArr = "string literal";、およびstdlib文字列メソッドから返されるいくつかの文字列charポインタ。

Cは境界チェックを行いません。したがって、サイズ2*charとして宣言された配列は、使用できる2つのメモリスロットを提供しますが、その両側のメモリ全体を自由に歩き回り、読み取りと書き込みを行って、未定義の動作を呼び出すことができます。そこに0バイトが表示される場合があります。 array[-1]に書き込んで、プログラムをクラッシュさせることができます。アレイのサイズを追跡し、割り当てていないメモリに触れないようにするのはあなたの責任です。

生のバイトの任意のバッファを保持するために、char配列を単純なchar配列として、つまりC文字列以外で使用するのが一般的です。

3
pb2q

tがサイズ2の配列である場合、最後のケースはt[2 - 1] = t[1]であり、2ではありません。t[2]は範囲外です。

1
md5