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

2 c pointers

在某些嵌入式设备上,我已经传递了一个没有强制转换的unsigned char指针.atoi

unsigned char c[10]="12";
atoi(c);
Run Code Online (Sandbox Code Playgroud)

问题:它定义明确吗?

看到某处字符串函数可以,但不确定atoi.

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


另外,我在这里,是确定这样做以下分配unsigned char也没关系指针?因为我使用了一些抱怨"类型不匹配(赋值)(ptrs to signed/unsigned)"的工具"

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

Kei*_*son 5

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

atoi函数声明<stdlib.h>为:

int atoi(const char *nptr);
Run Code Online (Sandbox Code Playgroud)

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

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

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

int atoi();
Run Code Online (Sandbox Code Playgroud)

这将允许用一个unsigned char*参数调用它.

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

但是添加演员要容易得多,而不是证明它不是必要的 - 或者更好的是,定义c为数组char而不是数组unsigned char,因为它意图保存一个字符串.

unsigned char *ptr = strtok(unscharbuff,"-");
Run Code Online (Sandbox Code Playgroud)

这也是违反约束的行为.没有来自隐式转换unsigned char*char*在第一个参数strtok调用,并没有来自隐式转换char*,以unsigned char*用于初始化ptr.