2016-03-27 14 views
0

私は、cの2次元配列のメモリレイアウトがどのように機能するかを調べようとしています。特に文字列の配列。行サイズが自動的に最長の文字列のサイズに一致するように設定されている2次元文字列配列のCメモリレイアウト

char *states[] = { 
    "California", "Oregon", 
    "Washington", "Texas" 
}; 

のような割り当てを行うとき、私はそれがthis site

を読んだ後に動作する方法を知っているが?

私は次のコードを使用してそれを理解しようとしましたが、まだそれを取得しません。

int main(){ 
    char *test[] = { 
    "0", "12", 
    "345", "6789" 
    }; 
    int i = 0; 
    int j = 0; 
    for (i=0; i<10; i++){ 
    for (j=0; j<10; j++){ 
    printf("%d,%d: ", i,j); 
    printf("%c\n", test[i][j]); 
    } 
} 
return 0; 
} 

私はすべての行が同じ大きさを持つべきであるという感覚を持っていますが、配列を横断するとき、次の文字列が単一の空白の直後に開始しますように思えます。

ありがとうございます!

答えて

0

実際には、2次元のchar配列はありません。代わりに、charポインターの1次元配列があります。 2次元のchar配列では、すべての文字列に割り当てられたメモリ量がまったく同じになります。あなたのケースは、実際には多くの点で単純です。コンパイラは一連の定数文字列を作成し、それらのポインタを使ってchar *配列を初期化します。各文字列にはそれぞれ独自の長さがあります。 (NULLバイトのために最大10文字、プラス1)ここで

char states[][11] = { 
    "California", 
    "Oregon", 
    "Washington", 
    "Texas" 
}; 

文字列の長さは、明示的である:ここでは

あなたは真の2次元char配列を宣言したい方法です。各文字列には、それらをすべて使用するかどうかにかかわらず、完全な文字数が与えられます。