我得到了这个警告:数组函数参数上的sizeof将返回'const char*'的大小而不是'const char []'

mko*_*mko 1 c

可能重复:
为什么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;
}
Run Code Online (Sandbox Code Playgroud)

我不知道以下警告意味着什么:

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[]) {
Run Code Online (Sandbox Code Playgroud)

任何的想法?

ale*_*nis 7

此警告告诉您,如果您调用sizeof(char[]),则不会获得数组的大小,而是char*指针的大小.

这意味着您的变量size_of_array将是错误的,因为它不代表真实数组的大小.

  • 那么如何修复它? (2认同)

Fre*_*Foo 6

那是因为const char source[]在论证位置只是语法糖const char *source.参见,例如,Steven Summit的C笔记.

在这种特殊情况下,您需要打电话strlen.不处理字符串时,将数组的大小作为单独的参数传递.