gpt4 book ai didi

c - 将 unsigned char 指针传递给 atoi 而不进行强制转换

转载 作者:行者123 更新时间:2023-12-02 08:27:43 25 4
gpt4 key购买 nike

在某些嵌入式设备上,我已将 unsigned char 指针传递给 atoi ,但没有 转换。

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

问题:是否明确定义?

saw某处字符串函数没问题,但不确定 atoi

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


此外,我在这里,是否也可以对 unsigned char 指针进行赋值?因为我使用了一些提示“类型不匹配(赋值)(指向签名/未签名的指针)”的工具

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

最佳答案

不,它没有明确定义。这是违反约束的情况,需要编译时诊断。在实践中,它很可能会按照您的预期工作,但不能保证一定会如此,恕我直言,这是一种糟糕的风格。

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

int atoi(const char *nptr);

您传递的是 unsigned char*期望 char* 的函数的参数争论。这两种类型不兼容,并且没有从一种类型到另一种类型的隐式转换。符合规范的编译器可能会发出警告(算作诊断),然后继续生成可执行文件,但该可执行文件的行为是未定义的。

从 C99 开始,调用没有可见声明的函数是违反约束的,因此您不能通过省略 #include <stdlib.h> 来逃避它。 .

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

int atoi();

这将允许使用 unsigned char* 调用它争论。

这几乎肯定会“起作用”,并且可以根据标准构建一个论据,即其行为已明确定义。 charunsigned char '1' 的值和 '2'保证具有相同的表示

但是添加强制转换比证明它不是必需的要容易得多——或者,更好的是,定义c。作为 char 的数组而不是 unsigned char 的数组,因为它旨在容纳一个字符串。

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

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

关于c - 将 unsigned char 指针传递给 atoi 而不进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30535814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com