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

可能重复:
为什么sizeof(param_array)是指针的大小?

我是C的新手,在编译代码时我收到了clang的警告:

 #include 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[]) { 

任何的想法?

这是因为参数位置的const char source[]只是const char *source语法糖。 参见,例如, Steven Summit的C笔记 。

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

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

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

我想你正在寻找这个。

将数组传递给函数时,数组的大小不会跟随。 实际上它是作为指针传递的,这就是警告信息提到的原因

将返回’const char *’的大小