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

在某些嵌入式设备上,我已经将一个unsigned char指针传递给atoi 而没有 atoi

 unsigned char c[10]="12"; atoi(c); 

问题:它定义明确吗?

我看到某处字符串函数可以,但是对atoi不确定。

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


另外,我在这里,是否可以执行以下对unsigned char指针的分配 ? 因为我使用了一些抱怨“类型不匹配(赋值)(ptrs to signed / unsigned)”的工具“

 unsigned char *ptr = strtok(unscharbuff,"-"); // is assignment also ok to unsigned char? 

不,它没有明确定义。 这是一个约束违规,需要编译时诊断。 在实践中,它很可能像你期望的那样工作,但不能保证这样做,而恕我直言,它的风格很差。

atoi函数在声明为:

 int atoi(const char *nptr); 

您将unsigned char*参数传递给需要char*参数的函数。 这两种类型不兼容,并且没有从一个到另一个的隐式转换。 符合标准的编译器可以发出警告(计为诊断),然后继续生成可执行文件,但该可执行文件的行为未定义。

从C99开始,对没有可见声明的函数的调用是违反约束的,所以你不能通过省略#include 来逃避它。

C仍然允许调用具有可见声明的函数,其中声明不是原型(即,没有定义参数的类型数)。 因此,您可以添加自己的声明,而不是通常的#include

 int atoi(); 

这将允许使用unsigned char*参数调用它。

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

但是添加演员要容易得多,而不是certificate它没有必要 – 或者更好的是,将c定义为char数组而不是unsigned char数组,因为它打算保存一个字符串。

 unsigned char *ptr = strtok(unscharbuff,"-"); 

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

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