如果我将值赋给当前未使用的字符串位置,会发生什么?

时间:2014-06-22 10:26:18

标签: c++ string

我几乎从不使用c ++字符串类型,但我需要使用一组字符串,所以我认为它们是最好的方法...

我这样编码:

string a;
a[0] = 'b';
printf("%s", a.c_str());

并打印出字母'b'

但是当我尝试时:

string a;
// i bellow would be a number from 0 to 9, so I add 48 to get the correspondent char
a[0] = 48 + i; 
printf("%s", a.c_str());

不打印一个数字...

我的问题是:是否因为幸运未定义的行为而在第一种情况下正确打印'b'?

我问的是因为如果我已经在位置0中有了一些东西,那么分配a [0] = 48 + i;会正确打印数字。

2 个答案:

答案 0 :(得分:1)

String是一个动态数组,因此您无法调用未定义的内存部分。呼唤中 string a; a[0] = 'b'; printf("%s", a.c_str());
非常危险,因为你已经访问了内存的其他部分并覆盖了这一点。我想你的程序会在程序的其他部分抛出错误。看看你做了什么:
string a; a[0] = 'b'; printf("%d ", a.size());输出当然是0

你必须在此之前保留记忆:a.resize(10)

答案 1 :(得分:-1)

如果这是平台相关的答案,请纠正我。我使用VS2012并且没有时间用gcc进行测试。

创建字符串之后,     string s;

它分配一些初始内存。你可以看到它,

s.capacity();//For me it gets 15

它返回一些非零值(同样在VS2012中)。所以,拥有,

s[0] = 'b';

很有意义。

如果你尝试一下,

a[10000] = 'b';

它会使你的程序崩溃。

a [0] = 48 + i(0 <= i <= 9)的情况,我说这不应该是一个问题,除了它在你的单身之后打印一些乱码数字。