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

时间:2014-04-03 20:30:24

标签: c

我现在回想起我的代码中的某些地方,我可能已经过去了 unsigned char*变量作为strcpystrtok等函数的参数 - 期望char *。我的问题是:这是一个坏主意吗?它会引起问题吗?

e.g。

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,...)

3 个答案:

答案 0 :(得分:3)

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

有关规则本身,请参阅here。该页面上的其他答案解释了它。

答案 1 :(得分:3)

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

  

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

所有标准库函数都将char个参数视为unsigned char,因此传递char*unsigned char*signed char*的方式相同。
引自<string.h>

的介绍
  

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

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

答案 2 :(得分:0)

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

e.g,

function((char *) buff, len);

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

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

作为一般规则,不要在没有签名的情况下进行无符号处理。