gcc 4.8 在我构建时给我一个错误
#include <string.h>
#include <stdio.h>
static inline void toto(char str[3])
{
snprintf(str, sizeof(str), "XX");
}
int main(){
char str[3];
toto(str);
return 0;
}
这是 gcc 错误
错误:“snprintf”调用中“sizeof”的参数与目标的表达式相同;您的意思是提供明确的长度吗?
注意:我使用 -Wall -Werror 标志将警告转换为错误。
这里有类似的东西 在评论中,有人回答了这个
“对于固定长度的缓冲区,我通常使用 strncpy(dest, src, sizeof(dest)); dest[sizeof(dest)-1] = '\0'; 这样可以保证 NULL 终止,而且比 snprintf 更省事,更不用说很多人使用 snprintf(dest, sizeof(dest), src); 代替,当他们的程序任意崩溃时感到非常惊讶。”
但这是错误的:gcc 4.8 说
“错误:‘strncpy’调用中‘sizeof’的参数与目标的表达式相同;您的意思是提供明确的长度吗?[-Werror=sizeof-pointer-memaccess]”
-Wall 的行为已更改,现在包括新的警告标志 -Wsizeof-pointer-memaccess。这可能会导致使用以前版本的 GCC 干净编译的代码中出现新的警告。
例如,
include string.h
struct A { };
int main(void)
{
A obj;
A* p1 = &obj;
A p2[10];
memset(p1, 0, sizeof(p1)); // error
memset(p1, 0, sizeof(*p1)); // ok, dereferenced
memset(p2, 0, sizeof(p2)); // ok, array
return 0;
}
给出以下诊断: 警告:“void memset(void*, int, size_t)”调用中“sizeof”的参数与目标的表达式相同;你的意思是取消引用它吗?[-Wsizeof-pointer-memaccess] memset(p1, 0, sizeof(p1)); // 错误 ^ 虽然这些警告不会导致编译失败,但通常 -Wall 与 -Werror 结合使用,因此新的警告会变成新的错误。要修复,要么重写以使用 memcpy,要么取消引用有问题的 memset 调用中的最后一个参数。*
好吧,在他们的例子中,很明显代码是错误的,但在我的例子中,使用 snprintf/strncpy,我不明白为什么,我认为这是 gcc 的错误 positif 错误。正确的 ?
感谢您的帮助