(为什么)空字符串有地址?

Bab*_*hin 13 c++

我猜不是,但这样的输出表明它确实如此

string s="";
cout<<&s;
Run Code Online (Sandbox Code Playgroud)

拥有地址的空字符串有什么意义?你认为不应该花费任何记忆吗?

aro*_*oth 22

是的,您保存在内存中的每个变量都有一个地址.至于"点"是什么,可能有几个:

  1. 你的(文字)字符串实际上不是"空",它包含一个'\ 0'字符.std::string为包含它而创建的对象可以分配自己的字符缓冲区来保存这些数据,因此它也不一定是空的.
  2. 如果您使用的字符串是可变的语言(如C++中的情况),则无法保证空字符串将保持为空.
  3. 在面向对象的语言中,仍然可以使用没有与之关联的数据的字符串实例来调用字符串类上的各种实例方法.这需要内存中的有效对象实例.
  4. 空字符串和null字符串之间存在差异.有时,区别可能很重要.

是的,我非常同意语言的实现,即"空"变量应该仍然存在并消耗内存.在面向对象的语言中,对象的实例不仅仅是它存储的数据,而且拥有当前没有存储任何实际数据的对象实例也没有错.

  • @wilhelmtell:`NULL`是一个扩展为null*指针*常量的宏.它不应该用于引用空字符(NUL,`'\'o``). (4认同)
  • 空字符串不一定包含NULL.实际上,std :: string可以在字符串中的任何位置保留NULL. (2认同)

kar*_*lip 6

遵循您的逻辑,int i;也不会分配任何内存空间,因为您没有为其分配任何值.但那么后来的运作怎么可能i = 10;呢?

当你声明一个变量时,实际上是分配具有一定规模(根据变量的类型)的存储空间来存储的东西.如果您想以正确的方式使用此空间取决于您,但变量的声明是触发内存分配的原因.

一些编码实践表明,在您需要使用它之前,不应声明变量.


Car*_*rum 5

"空"字符串对象仍然是一个对象 - 其内部实现可能不仅仅是存储文字字符串本身所需的内存.除此之外,大多数C风格的字符串(如C++中使用的字符串)都是以空值终止的,这意味着即使"空"字符串仍然使用一个字节作为终结符.

  • `std :: string`不是以null结尾的,它可以在任何地方包含任意数量的空字节. (2认同)