5

重複の可能性:
sizeof(param_array)がポインターのサイズであるのはなぜですか?

私はCを初めて使用しclangます。コードをコンパイルするときに、次の警告が表示されます。

#include<stdio.h>

char *strcpy (char destination[],const char source[]);
int main(void) {
    char str1[] = "this is a very long string";
    char str2[] = "this is a short string";
    strcpy(str2, str1);
    puts(str2);
    return 0;
}
char *strcpy (char destination[], const char source[]) {
    int size_of_array = sizeof source / sizeof source[0];
    for (int i = 0; i < size_of_array; i++) {
        destination[i] = source[i];
    }
    return destination;
}

次の警告の意味がわかりません。

string_copy_withou_pointer.c:12:29: warning: sizeof on array function parameter
      will return size of 'const char *' instead of 'const char []'
      [-Wsizeof-array-argument]
        int size_of_array = sizeof source / sizeof source[0];
                                   ^
string_copy_withou_pointer.c:11:46: note: declared here
char *strcpy (char destination[], const char source[]) {

何か案が?

4

4 に答える 4

10

この警告は、呼び出すsizeof(char[])と、配列のサイズではなくchar*ポインターのサイズが取得されることを示しています。

これは、実際の配列のサイズを表していないため、変数size_of_arrayが間違っていることを意味します。

于 2012-10-22T07:24:49.250 に答える
8

これconst char source[]は、引数の位置が。の単なる構文糖衣であるためconst char *sourceです。たとえば、StevenSummitのCノートを参照してください。

この特定のケースでは、を呼び出す必要がありますstrlen。文字列を処理しない場合は、配列のサイズを個別の引数として渡します。

于 2012-10-22T07:23:57.603 に答える
1

あなたはこれを探していると思います。

于 2012-10-22T07:23:38.117 に答える
1

関数に渡すとき、配列のサイズは続きません。実際にはポインターとして渡されるため、警告メッセージに言及されています

「const char *」のサイズを返します

于 2012-10-22T07:25:25.840 に答える