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

C++ 从类型char到int的转换产生不同的结果,c++,string,char,int,C++,String,Char,Int,在下面的代码中,我想知道为什么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; charc='4'; 常量字符*b; int i,j; i=atoi(字符串(1,c)

在下面的代码中,我想知道为什么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;
charc='4';
常量字符*b;
int i,j;
i=atoi(字符串(1,c).c_str());
b=字符串(1,c).c_str();
j=原子(b);
在某些体系结构(操作系统、编译器、stl实现)上,代码按预期生成“4”。试试看

问题在于,代码依赖于未定义的行为,因为它使用已销毁的对象返回的指针

当你写作时

b = string(1,c).c_str();
您正在创建一个临时对象,并要求它提供一个指向字符数组的指针。将此指针指定给b,然后临时对象(拥有b现在指向的内存)被销毁。假设库是“正常的”,那么在字符串销毁过程中会释放这样的内存。因此,通过指针b访问内存是未定义的行为

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

b=string(1,c).c_str();
b
指向在此语句之后被销毁的临时对象。它实际上具有未定义的行为

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

int i = c- '0';
b=string(1,c).c_str()

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

如果按照这种方式进行操作,则需要确保调用
atoi
时原始
字符串
有效

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());

只要对其调用的字符串有效,并且没有对其调用任何非常量函数。这是否意味着在语句
b=string(1,c).c_str()
中,字符串只是一个临时对象,因此pinter
c_str
无效。是的,它在中创建完整表达式之前是有效的。