web-dev-qa-db-ja.com

Sizeof vs Strlen

#include "stdio.h"
#include "string.h"

main()
{

    char string[] = "october"; // october is 7 letters

    strcpy(string, "september"); // september is 9 letters

    printf("the size of %s is %d and the length is %d\n\n", string, sizeof(string), strlen(string));

    return 0;
}

出力:

9月のサイズは8で、長さは9です

私の構文に何か問題がありますか?

40
beparas

sizeofstrlen()は異なる動作をします。この場合、あなたの宣言

_char string[] = "october";
_

と同じです

_char string[8] = "october";
_

そのため、コンパイラはstringのサイズが8であることを認識できます。これはコンパイル時に行われます。

ただし、strlen()は、実行時に文字列の文字数をカウントします。したがって、strcpy()を呼び出した後、stringには「september」が含まれるようになります。 strlen()は文字をカウントし、そのうちの9つを見つけます。 stringが「9月」を保持するのに十分なスペースを割り当てていないことに注意してください。これは未定義の動作です。

40
Sean

出力は正しいため

最初のステートメントの文字列サイズは、コンパイラによって7 + 1に割り当てられました(10月はコンパイル時にNULLターミネータに対して7バイトと1バイトです)

2番目のステートメント:9月(9バイトから8バイトの文字列)をコピーしています。

あなたのために8バイトとして9月のサイズを取得しました(まだstrlen()は9月には機能しません、それはnull文字を持っていません)

2
Praveen.thota

宛先配列は8バイト(「10月」の長さに\ 0を加えたもの)であり、その配列に9文字を入れます。

man strcpy言います:strcpy()の宛先文字列が十分に大きくない場合、何でも起こります。

あなたが本当にやりたいことを教えてください

1
ola1olsson