使用带符号方法(如strcpy)的unsigned char *

我现在在我的代码的某些地方回忆起我可能已经将unsigned char*变量作为参数传递给strcpystrtok等函数 – 它们期望char * 。 我的问题是:这是一个坏主意吗? 它会引起问题吗?

例如

 unsigned char * x = // .... some val, null terminated unsigned char * y = // ... same here; strcpy(x,y); // ps assuming there is space allocated for x 

例如, unsigned char * x = strtok(NULL,...)

它保证是正常的(在你转换指针之后),因为“严格别名规则”有一个特殊的例外,它通过有signedunsigned变体查看同一个对象。

请参阅此处了解规则本身。 该页面上的其他答案解释了它。

C别名规则对签名/无符号变体以及一般的char访问都有例外。 所以这里没问题。
从标准引用:

对象的存储值只能由具有以下类型之一的左值表达式访问:88)
– 与对象的有效类型兼容的类型,
– 与对象的有效类型兼容的类型的限定版本,
– 对应于对象的有效类型的有符号或无符号类型,
– 对应于对象有效类型的限定版本的有符号或无符号类型,
– 聚合或联合类型,其成员中包含上述类型之一(包括递归地,子聚合或包含联合的成员),或者
– 一个字符类型。

所有标准库函数都将任何char参数视为unsigned char ,因此传递char*unsigned char*signed char*的方法相同。
引用的介绍:

对于本子条款中的所有函数,每个字符都应解释为它具有unsigned char类型(因此每个可能的对象表示都是有效的并且具有不同的值)。

但是,如果你的签名错误,你的编译器应该抱怨,特别是如果你启用所有警告(你应该,总是)。

unsigned char *转换为char * (反之亦然)的唯一问题是它应该是一个错误。 用演员表修复它。

例如,

function((char *) buff, len);

话虽这么说, strcpy需要使用空终止字符( \0 )才能正常工作。 另一种方法是使用memcpy

但是你不应该使用带有字符串处理函数的unsigned char数组。 在C字符串中是char数组,而不是unsigned char数组。 由于传递给strcpy会丢弃unsigned限定符,编译器会发出警告。

作为一般规则,在不必要的时候不要做无符号的事情。