警告:'strcat'的参数2中的指针目标在签名方面有所不同

时间:2017-05-16 05:12:52

标签: c strcat

以下是简单的代码:

unsigned char buf[255];
unsigned char msg[255];

while((res = read (fd, buf, (sizeof buf)-1)) > 0)
{
   buf[res] = '\0';
   strcat(msg, buf);
   length += res;
   if(length >= 10)
        break;
}

这一行strcat(msg, buf);给出了以下警告:

warning: pointer targets in passing argument 1 of ‘strcat’ differ in signedness

我已经尝试了针对类似问题找到的所有解决方案,但没有多大帮助。当两个变量具有相同的符号时,任何人都可以帮助解释为什么这会给出错误。我该如何删除它。感谢

编辑:

unsigned const char *buf[255];
unsigned char *msg[255];
strcat(msg, buf);

现在它发出警告:

warning: passing argument 2 of ‘strcat’ from incompatible pointer type

1 个答案:

答案 0 :(得分:0)

将我的comment扩展为类似答案的内容。

strcat()函数需要普通字符*:

char *strcpy(char * restrict s1, const char * restrict s2);

你正在通过unsigned char *。这些是不同的类型(即使普通char是无符号类型)。 str*()函数不是为了获取unsigned char的数组而设计的。要“安抚”(或“胁迫”)编译器接受调用,您需要转换指针:

strcat((char *)msg, (char *)buf);

或者编写并使用一系列自动执行此操作的功能:

static inline unsigned char *ustrcat(unsigned char *dst, const unsigned char *src)
{
    return (unsigned char *)strcat((char *)dst, (char *)src);
}

如果您需要经常使用这些功能,这可能是一个好主意;这意味着你不必在你的代码周围留下这么多难看的演员阵容。如果您愿意,可以添加restrict限定符。

请注意,charunsigned charsigned char这三种类型是截然不同的,即使普通char具有与其他两种值相同的值范围。 ISO / IEC 9899:2011§6.2.5类型说:

  

¶15统称为charsigned charunsigned char三种类型   字符类型。实现应将char定义为具有相同的范围,   表示和行为为signed charunsigned char 45)

     CHAR_MIN中定义的

45) <limits.h>将具有值0SCHAR_MIN中的一个,这可以是   用来区分这两个选项。无论做出何种选择,char都是一个独立的类型   另外两个并且与两者都不兼容。

您的代码容易受到缓冲区溢出的影响,因为您没有在任何地方检查长度。这与您获得的编译警告相关,但您应该确保不要将太多数据复制到目标缓冲区中。

您还尝试过:

unsigned const char *buf[255];
unsigned char *msg[255];
strcat(msg, buf);

现在你传递的指针指向一个只需要指向char的函数的指针 - 编译器是抱怨的。