0

I wonder in the code below that why the result of i and j is different.To my intuition,b also pointed to the address of a char with value 4.why do the result of i and j is different

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;
4

3 回答 3

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

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

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

int i = c- '0';
于 2013-07-12T11:40:56.233 回答
2

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

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

当你写

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

您正在创建一个临时对象并要求它提供一个指向字符数组的指针。您将此指针分配给 b ,然后临时对象(拥有 b 现在指向的内存)被销毁。假设该库是“健全的”,则在字符串销毁期间将释放此类内存。因此,通过指针 b 访问内存是未定义的行为。

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

于 2013-07-12T11:40:31.053 回答
2

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

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

如果你沿着这条路线做事,你需要string在调用时确保原件是有效的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());
于 2013-07-12T11:41:19.970 回答