从类型char到int的转换会产生不同的结果

transform from type char to int produce different result

本文关键字:结果 转换 类型 char int      更新时间:2023-10-16

在下面的代码中,我想知道为什么I和j的结果不同。根据我的直觉,b还指向了一个值为4的字符的地址。为什么i和j的结果是不同的

char c='4';
const char *b;
int i,j;
i=atoi(string(1,c).c_str());
b=string(1,c).c_str();
j=atoi(b);
cout<<i<<" "<<j<<endl;
b=string(1,c).c_str();

b指向一个临时对象,该对象在该语句之后被销毁。它实际上有未定义的行为

将char转换为int的一个简单方法是:

int i = c- '0';

b = string(1,c).c_str();

这将在表达式之后创建一个超出范围的临时string。问题是,c_str()返回的指针只有在调用它的字符串存在并且没有调用任何非常数函数的情况下才有效。

如果你按照这种方式行事,那么在调用atoi时,你需要确保原始的string是有效的。

std::string s(1,c);
b = s.c_str();
j = atoi(b);
s.clear(); // b is no longer valid now!

或者:

j = atoi(string(1,c).c_str());

在某些体系结构(操作系统、编译器、stl实现)上,代码会按预期生成"4 4"。在这里试试。

问题是,代码依赖于未定义的行为,因为它使用了一个被破坏的对象返回的指针。

当你写

b = string(1,c).c_str();

您正在创建一个临时对象,并要求它提供一个指向字符数组的指针。您将此指针分配给b,然后临时对象(拥有b现在指向的内存)将被销毁。假设库是"正常的",那么在字符串销毁过程中,这样的内存将被释放。因此,经由指针b访问存储器是未定义的行为。

当然,你不应该依赖未定义的行为,即使它在某些情况下"有效"。