我正在处理的代码具有从uint8
到char
的大量转换,然后在此转换上调用C库函数。我试图理解为什么与uint8
相比,作家更喜欢char
。
例如:
uint8 *my_string = "XYZ";
strlen((char*)my_string);
\0
会发生什么,我投放时会添加吗?
当我反过来时会发生什么?
这是一种合法的工作方式,为什么有人会比uint8
更喜欢与char
合作?
答案 0 :(得分:9)
强制转换$setters = array();
if ($trim($email) != '') $setters[] = "use_email = '$email'";
if ($trim($nome) != '') $setters[] = "use_name = '$nome'";
if ($trim($pass) != '') $setters[] = "use_pass = '$pass'";
$query = "UPDATE users SET ".implode(", ",$setters)." WHERE use_id = '$id'";
$result = mysqli_query($con,$query);
很好。始终允许以未签名的字符(包括字符串文字)的形式访问任何已定义的内存,然后当然要强制转换指向指向字符串文字的指针,将其指针返回到char <=> uint8
。
在
char *
uint8 *my_string = "XYZ";
是一个包含4个"XYZ"
的匿名数组-包括结尾的零。这会衰减为指向第一个字符的指针。然后将其隐式转换为char
-严格来说,它应该具有显式强制转换。
类型uint8 *
的问题在于,标准将其留给实现来定义它是带符号的还是无符号的。如果字符/字节有很多算术运算符,则默认情况下将它们取消签名可能会有所帮助。
一个特别臭名昭著的示例是char
及其<ctype.h>
字符类功能-is*
,isspace
等。他们要求字符为unsigned char
s (converted to int)!一段等效于isalpha
的代码是不可移植的,编译器甚至无法对此发出警告!如果char c = something(); if (isspace(c)) { ... }
类型在平台上签名(默认在x86上!)并且该字符不是ASCII(或更恰当的说,是基本执行字符集的成员),则该行为是不确定的-{{ 3}},但不幸的是,它只会在glibc上导致静默的未定义行为(数组访问超出范围)。
但是,编译器对于使用char
或其别名作为unsigned char *
的参数(因此强制转换)会大声疾呼。