我现在回想起我的代码中的某些地方,我可能已经过去了
unsigned char*
变量作为strcpy
和strtok
等函数的参数 - 期望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,...)
答案 0 :(得分:3)
它保证是正常的(在你转换指针之后),因为“严格别名规则”有一个特殊的例外,可以通过signed
和unsigned
变体查看同一个对象。
有关规则本身,请参阅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
会丢弃无符号限定符,编译器会发出警告。
作为一般规则,不要在没有签名的情况下进行无符号处理。