2017-09-02 2 views
0
int main() 
{ 
    char a[2][3][3] = {'g','a','t','e','s','q','u','i','z','a','w'}; 
    printf("%s ", ***a); 
    return 0; 
} 

このコードは、*** aにSeg Faultを与えます。この配列がどのようにメモリに格納されているかを、メモリダイアグラムで説明してください。もし私が間違っているなら、3行3列の2列の配列を修正してください。また、空のスペースに '/ 0'または不要な値が格納されているかどうかを確認します。メモリモデルダイアグラムでコードのo/pをどのように計算できますか?なぜこれがセグメンテーションフォールトを与えているのですか?

+0

同じ質問がちょうど変更した後、アスカーによって削除されました「%:Cで1つだけのメモリのブロックと、実際にa変数は、あなたがこのようにそれを行うことができ、その最初のバイトだけのアドレスでありますs "を"%c "に変更します。それはあなたのために適切ですか?たぶん、尋問者は同じ任務に取り組んでいるあなたの同僚です。 – Yunnosch

+0

簡単な答えは、 '*** a'は' char'で、 ''%s "'は正しい書式ではありません。 *エラー:formatは 'char \ *'型を指定しますが、引数に 'char'型* –

答えて

1

printf("%s ", ***a);は明白な理由のために無効であるポインタにチャー'g'を変換するため - ポインタの文字変換がUB

この機能の違いを見ると同様に(同様に端でゼロを気)

int zz() 
{ 
    char a[2][3][3] = { 'g','a','t','e','s','q','u','i','z','a','w',0 }; 
    printf("%s ", &***a); 
    return 0; 
} 

または

int yyy() 
{ 
    char a[2][3][3] = { 'g','a','t','e','s','q','u','i','z','a','w',0 }; 
    char *ptr = **a; 
    while (*ptr) printf("%c", *ptr++); 
    return 0; 
} 
+0

が指定されていることは明らかです。質問。 – bolov

+0

"printf("%s "、*** a); printf("%c "、*** a)を書くと、printf("%s "、*** a); o/pは 'g'ですが、%sの場合はそうではありません。 –

+0

***は、配列の最初の要素を参照します(この場合は 'g')。次に、ASCIIコード 'g'の整数値がポインタに変換されます。メモリ内の不正な場所を指しています。この場所にアクセスしようとすると、メモリエラーが発生します –

0

あなたの目標は、多次元配列を実証することであった場合

char a[2][3][3] = {'g','a','t','e','s','q','u','i','z','a','w'}; 

// Print all chars, this is ok because you've initialized your 
// 12-element array by 11 chars and the last one is automatically set to 0 
printf("%s\n", (char *)a); 

// Print the first char 
printf("%c\n", *(char *)a); 
関連する問題