在某些嵌入式设备上,我已将[{1}}指针传递给unsigned char
而不一个演员。
atoi
问题:定义明确吗?
我saw某处可以使用字符串函数,但不确定unsigned char c[10]="12";
atoi(c);
。
编辑:顺便说一下。在下面的答案之一中已经表达了一些担忧,即使对于字符串函数(例如strcpy)它可能也不行 - 但如果我做对了(?),作者也意味着在实践中这可能是正常的。
另外我在这里,是否可以按照赋值对atoi
指针进行操作?因为我使用了一些抱怨的工具"类型不匹配(分配)(ptrs签名/未签名)"
unsigned char
答案 0 :(得分:5)
不,它没有明确定义。这是一个约束违规,需要编译时诊断。在实践中,它很可能像你期望的那样工作,但不能保证这样做,而恕我直言,它的风格很差。
atoi
函数在<stdlib.h>
中声明为:
int atoi(const char *nptr);
您将unsigned char*
参数传递给期望char*
参数的函数。这两种类型不兼容,并且没有从一个到另一个的隐式转换。符合标准的编译器可能会发出警告(计为诊断),然后继续生成可执行文件,但该可执行文件的行为未定义。
从C99开始,对没有可见声明的函数的调用是违反约束的,所以你不能通过省略#include <stdlib.h>
来逃避它。
C仍然允许调用具有可见声明的函数,其中声明不是原型(即,没有定义参数的类型数)。因此,您可以添加自己的声明,而不是通常的#include <stdlib.h>
:
int atoi();
允许用unsigned char*
参数调用它。
这几乎肯定会“起作用”,并且有可能从标准构造一个论证,即它的行为是明确定义的。 char
和unsigned char
的{{1}}和'1'
值保证具有相同的表示
但是添加演员要容易于证明没有必要 - 或者更好的是,将'2'
定义为c
的数组而不是{{1}的数组因为它打算保存一个字符串。
char
这也是违反约束的行为。对于unsigned char
调用中的第一个参数,没有从unsigned char *ptr = strtok(unscharbuff,"-");
到unsigned char*
的隐式转换,并且没有从char*
到strtok
的隐式转换初始化char*
。
答案 1 :(得分:1)
是的,这些功能完全正常。您的编译器设置将确定您是否收到有关类型的警告。我通常使用-Wall编译,打开所有警告,然后在代码中为每个案例使用静态强制转换,以便我知道我已仔细检查过它们。最终结果是零错误和零警告,并且在将来触发警告的任何更改都将非常突出,而不会在100条容忍消息中丢失。