gpt4 book ai didi

c# - C#中损坏的字符串

转载 作者:IT王子 更新时间:2023-10-29 03:41:55 25 4
gpt4 key购买 nike

我遇到了 “CorruptedString” (Solution) 。以下是书中的程序代码:

var s = "Hello";
string.Intern(s);
unsafe
{
fixed (char* c = s)
for (int i = 0; i < s.Length; i++)
c[i] = 'a';
}
Console.WriteLine("Hello"); // Displays: "aaaaa"

为什么这个程序显示“aaaaa”?我对这个程序的理解如下:

  1. CLR在实习生池中保留“hello”(我将实习生池想象成一组字符串)。
  2. string.Intern(s) 实际上什么都不做,因为 CLR 保留了“Hello”字符串 - 它只是返回保留的“Hello”字符串的地址(对象 s 具有相同的地址)<
  3. 程序通过指针改变“Hello”字符串的内容
  4. >???实习生池中应该没有hello字符串,应该报错!但没关系;程序运行成功。

据我了解,实习生池就像某种字符串到字符串的字典。或者我错过了什么?

最佳答案

当您第一次使用“Hello”时,它会驻留在应用程序的全局字符串存储中。基于您在 unsafe 模式下执行的事实(有关 unsafe here 的更多信息),您获得了对存储在最初为值分配的位置中的数据的直接引用string s, so by

for (int i = 0; i < s.Length; i++)
c[i] = 'a';

您正在编辑内存中的内容。当它下次访问驻留字符串的存储时,它将使用内存中的相同地址,保存您刚刚更改的数据。如果没有 unsafe,那是不可能的。 string.Intern(s); 在这里没有作用;如果您将其注释掉,它的行为是一样的。

然后通过

Console.WriteLine("Hello"); // Displays: "aaaaa"

.NET 查看是否有为 "Hello" 获取的地址的条目,并且有:您刚刚更新为 “aaaaa”'a' 字符的数量由 "Hello" 的长度决定。

关于c# - C#中损坏的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com