2

重複の可能性:
C で文字列の配列を作成するには?

私の最後の質問では、次のコード行を書きました

#include <stdio.h>
int main(void){
  char str1[] = {'f','i'};
  char str2[] = {'s','e'};
  char str3[] = {'t','h'};
  char *arry_of_string[] = {str1,str2,str3};
  printf("%s\n",arry_of_string[1]);
}  

人々のおかげで、文字列の最後に '\0' を付けるべきだと指摘してくれました。これを行う正しい方法を学びました。欠陥のあるコードの結果に興味があります:

sefi

C のリファレンス ブックから覚えているのですが、'\0' を探すポインターは\0ターミネータなしだと思います。結果は次のようになります。

seth str3 は配列の次の要素であるためです。なぜそれが配列の内部構造の観点から説明できるのですか?

4

1 に答える 1

0

C は、メモリ内の変数の順序について保証しませんただし、最初のメンバーが構造体のオフセット 0 にあるように、構造体メンバーが順番にメモリに配置されることが保証されます。

つまり、コンパイラのバージョン、コンパイル オプション、または月の満ち欠けによっていつでも変更される可能性がある、未定義の動作をテストしていることになります。未定義の動作に依存しないでください。コンパイラをリバース エンジニアリングしないでください。履歴書が長くなりすぎる前に時代遅れになるのはほとんど役に立たない知識であり、将来他のコンパイラに対処しなければならないときに驚きを引き起こすだけです.

C がどのように機能するかを知りたい場合は、唯一の信頼できる情報源であるISO C Standardをお読みください。代替物を受け入れない ( Kernighan, Ritchie, " The C Programming Language , 2nd ed."以外)

于 2012-07-27T12:41:50.523 に答える