C编程更喜欢uint8而不是char

时间:2018-07-08 07:51:58

标签: c

我正在处理的代码具有从uint8char的大量转换,然后在此转换上调用C库函数。我试图理解为什么与uint8相比,作家更喜欢char。 例如:

uint8 *my_string = "XYZ";
strlen((char*)my_string);

\0会发生什么,我投放时会添加吗?

当我反过来时会发生什么?

这是一种合法的工作方式,为什么有人会比uint8更喜欢与char合作?

1 个答案:

答案 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 chars (converted to int)!一段等效于isalpha的代码是不可移植的,编译器甚至无法对此发出警告!如果char c = something(); if (isspace(c)) { ... }类型在平台上签名(默认在x86上!)并且该字符不是ASCII(或更恰当的说,是基本执行字符集的成员),则该行为是不确定的-{{ 3}},但不幸的是,它只会在glibc上导致静默的未定义行为(数组访问超出范围)。

但是,编译器对于使用char或其别名作为unsigned char *的参数(因此强制转换)会大声疾呼。