1

アレイが1つあります

char * string = “hello”;

私が読んだときstring[5]、値は0です。これはランダムな値ではありませんか?

私の疑問は、memcmp2つのアレイを比較するために使用するときに発生します。argvの長さは配列の長さよりも長いですが、正しく機能します。'\ 0'を読み取ると停止することはわかってmemcmpいますが、配列には'\0'がありません。これをDevC++でテストしました。

4

3 に答える 3

5

いいえ、配列"hello"には6つcharのが含まれ、最後は'\0'です。したがって、あなたの状況では、string[5]であることが保証されています'\0'string[6]ただし、未定義の動作が発生します。

しかしmemcmp、0バイトで停止するのではなく、停止するだけstrcmpです。

于 2012-07-18T09:30:38.573 に答える
4

"hello"、null で終了することが保証されている文字列定数です。これは、'\0'指定した最後の文字の後に追加の文字が含まれていることを意味します。

つまり、実質的には次のものと同等です。

char string[] = {'h', 'e', 'l', 'l', 'o', '\0'};

次を使用して簡単に確認できます。

#include <stdio.h>

char string[] = "hello";

int main()
{
    printf("%d\n", sizeof(string));
    return 0;
}

(製品コードでは%dwithを使用しないでください)sizeof()

そのプログラムは出力します6

于 2012-07-18T09:35:51.077 に答える
0

はい、memcmp は '\0' を持たない配列を比較できます。
たとえば、このコードを見てください。

int main () {

     char str1[]= "hello";
     char str2[]= "hello";
     std::cout << memcmp(str1, str2, 5);
     std::cout << memcmp(str1, str2, 6);
     return 0;
}

どちらも画面に 0 を出力します。サイズが 5 の場合、'\0' なしで比較されます。size が 6 の場合、'\0' も比較されます。memcmp は単にメモリのブロックを比較します。

于 2012-07-18T09:56:29.083 に答える