13

おそらく私はググるにはあまりにもダンプしすぎていますが、char 配列はリテラルの初期化 ( char x[]="asdf";) によって null で終了するだけだといつも思っていましたが、そうではないことがわかったときは少し驚きました。

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

出力: 0

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

4

3 に答える 3

26

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

あなたの本当の質問に答えて:文字列リテラルだけがnullで終了します、そしてそれはそれが要素char x[]="asdf"の配列であることを意味します。5

于 2012-06-27T15:14:54.897 に答える
4

char配列は自動的に NULL で終了するのではなく、文字列リテラルのみですchar *myArr = "string literal";

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

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

于 2012-06-27T15:21:04.763 に答える
1

tが size の配列である場合2、最後のケースはt[2 - 1] = t[1]2 ではなくです。t[2]は範囲外です。

于 2012-06-27T16:03:31.773 に答える