在某些嵌入式设备上,我已经传递了一个没有强制转换的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)
不,它没有明确定义.这是一个约束违规,需要编译时诊断.在实践中,它很可能像你期望的那样工作,但不能保证这样做,而恕我直言,它的风格很差.
该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*参数调用它.
这几乎肯定会"起作用",并且有可能从标准中构造一个其行为定义明确的论证.的char和unsigned 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.
| 归档时间: |
|
| 查看次数: |
1568 次 |
| 最近记录: |