2016-11-03 14 views
0
#include <stdio.h> 
#include <string.h> 
void main(){ 
    char sss[0]; //array with 0 elements 
    sss[0]= 'h'; sss[1]= 'o'; sss[2]= 'w'; //how does this line compile wihtout error? 
    printf("sss after 3 chars added: %s\n", sss); 
    strcpy(sss, "n"); 
    printf("sss after strcpy: %s\n", sss); 
    strcat(sss, " stuff"); 
    printf("sss after strcat: %s\n", sss); 
} 

ここでは、サイズ0の文字配列 'sss'を宣言しました。したがって、任意の要素に任意のcharを割り当てることはできません。ただし、配列は動的に割り当てられたものと同じように動作し、任意の数の文字を割り当てることができます。上記のコードは次の出力を生成します。C文字配列(C文字列)動的か?

sss after 3 chars added: how 
sss after strcpy: n 
sss after strcat: n stuff 

Cは配列の割り当てが厳しく、 "配列のサイズが範囲外です"というエラーが発生すると考えていました。なぜ/これはどうですか?

+2

これを参照してください:http://stackoverflow.com/questions/15646973/how-dangerous-is-it-to-access-an-array-out-of-bounds –

+0

'"配列サイズが範囲外です "エラーこれはCのものでもあるという考えをどこから得ましたか? – John3136

+1

sssは単なるポインタです。 sss [X]は*(sss + X) –

答えて

0

Cでは、0の配列を定義することはできません。

C11、6.7.6.2 Array declaratorsは言う:オプションタイプ修飾子とキーワード静的に加え

、[ と】発現または*を区切ることができます。それらが式 (配列のサイズを指定する)を区切る場合、式は 整数型でなければなりません。 式が定数式である場合、 は0より大きい値を持ちます。

その配列に値を代入することを含め、多くのことは、undefined behaviourです。

0

配列項目にメモリを割り当てていないため、動作は未定義です。 試してみる char sss[3]; ここでは、未定義の動作をせずに個々の配列インデックスに割り当てることができます。