将无符号的char指针传递给atoi而不进行强制转换

时间:2015-05-29 17:38:15

标签: c pointers

在某些嵌入式设备上,我已将[{1}}指针传递给unsigned char 而不一个演员。

atoi

问题:定义明确吗?

saw某处可以使用字符串函数,但不确定unsigned char c[10]="12"; atoi(c);

编辑:顺便说一下。在下面的答案之一中已经表达了一些担忧,即使对于字符串函数(例如strcpy)它可能也不行 - 但如果我做对了(?),作者也意味着在实践中这可能是正常的。

另外我在这里,是否可以按照赋值atoi指针进行操作?因为我使用了一些抱怨的工具"类型不匹配(分配)(ptrs签名/未签名)"

unsigned char

2 个答案:

答案 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*参数调用它。

这几乎肯定会“起作用”,并且有可能从标准构造一个论证,即它的行为是明确定义的。 charunsigned char的{​​{1}}和'1'值保证具有相同的表示

但是添加演员要容易于证明没有必要 - 或者更好的是,将'2'定义为c的数组而不是{{1}的数组因为它打算保存一个字符串。

char

这也是违反约束的行为。对于unsigned char调用中的第一个参数,没有从unsigned char *ptr = strtok(unscharbuff,"-"); unsigned char*的隐式转换,并且没有从char*strtok的隐式转换初始化char*

答案 1 :(得分:1)

是的,这些功能完全正常。您的编译器设置将确定您是否收到有关类型的警告。我通常使用-Wall编译,打开所有警告,然后在代码中为每个案例使用静态强制转换,以便我知道我已仔细检查过它们。最终结果是零错误和零警告,并且在将来触发警告的任何更改都将非常突出,而不会在100条容忍消息中丢失。