2011-10-21 7 views
1

私は基本的な説明をしました。ここで私が試したコードスニペットです。char配列に関する説明

void fill(char s[]) 
{ 
    strcpy(s,"temp"); 
} 

int main() 
{ 
    char line[100]; 
    fill(line); 
    printf("%s",line); 
    return 0; 
} 

期待どおり、出力はtempです。 lineはローカル配列ですが、fillに変更することができ、呼び出し元に反映されます。私が理解しているのは、fill(line)と言うとき、実際には配列の開始アドレスを渡しているからです。

正しいですか?

答えて

3

はい、正しくあります。

これは危険なコードです。このタイプのコードでは、fillが渡されたバッファの終わりを上書きするのは非常に簡単です。塗りつぶしはバッファのサイズを知っていて、そのサイズの終わりを過ぎて書き込むべきではありません。

たとえば、 "temp"を書き込むのではなく、War and Peaceの内容に書いておけば、プログラムは変数lineに関連付けられていない多くの他のメモリ位置を喜んで上書きします。

0

はい、アレイはC.

+1

いいえ、すべての値がCで渡されます。この場合、値はちょうどアドレス(つまりポインタ)になります。 – dmc

0

はい参照により渡されます。この場合、配列名はポインタに崩壊し、次にそれがfillに渡されます。

0

はい、配列はベースアドレスを使用して渡されます

0

はい。そのとおりです。明示的に開始アドレスを指定したい場合、コードはわずかにしか変更されません。以下を参照してください:fill関数の引数がポインタになったことに注意してください。

void fill(char *s) 
{ 
    strcpy(s,"temp"); 
} 

int main() 
{ 
    char line[100]; 
    fill(line); 
    // EQUIVALENT: fill(&line[0]); 
    printf("v%s\n",line); 
    return 0; 
} 
関連する問題