C# 如何在VisualStudio2010C中获取字符串的堆栈内存地址#
我目前正在大学学习计算机科学课程,我们最近看到了如何在调试器中使用&和*获取变量的内存地址。我的老师告诉我,本地值类型变量在堆栈中,引用类型在堆中。但是他也告诉我们堆栈应该包含字符串在堆中的地址 我不知道你是否理解我想说的,但这应该是可能的,因为我在他给我们的笔记中看到了。但是当他试图给我们看的时候,它不起作用,他也不知道为什么 我想知道如何操作,但当我尝试时,总是会收到以下错误消息: 无法获取的地址、大小或声明指向托管类型(“字符串”)的指针 我在调试器中写入C# 如何在VisualStudio2010C中获取字符串的堆栈内存地址#,c#,visual-studio-2010,C#,Visual Studio 2010,我目前正在大学学习计算机科学课程,我们最近看到了如何在调试器中使用&和*获取变量的内存地址。我的老师告诉我,本地值类型变量在堆栈中,引用类型在堆中。但是他也告诉我们堆栈应该包含字符串在堆中的地址 我不知道你是否理解我想说的,但这应该是可能的,因为我在他给我们的笔记中看到了。但是当他试图给我们看的时候,它不起作用,他也不知道为什么 我想知道如何操作,但当我尝试时,总是会收到以下错误消息: 无法获取的地址、大小或声明指向托管类型(“字符串”)的指针 我在调试器中写入&nameofstringvari
&nameofstringvariable
,不带引号。我喜欢了解事情是如何运作的,我在谷歌上搜索了几个小时来解决这个问题,但我从未找到解决办法。尝试使用不安全的代码,但无效
我目前正在大学学习计算机科学课程,我们最近看到了如何在调试器中使用&和*获取变量的内存地址
&
提供C#中非托管类型的固定变量的地址;结果是一个指针*
取消对指针的引用并将其转换回变量,它不会提供变量的地址
我的老师告诉我,本地值类型变量在堆栈中,引用类型在堆中
让我们确保这是正确的,因为这是非常混乱的
如果已知局部变量的生存期较短,则该局部变量将进入堆栈,而不管该变量是否包含值类型的实例或对堆的引用。请注意,局部变量的生存期不要求很短!例如,考虑λ的闭合外变量;它的生存期与关联的委托相同,但并不短,因此它不能进入堆栈
引用类型的实例位于堆上,因此与引用类型的实例关联的变量位于堆上。但参考文献不必如此。引用类型的引用和实例与蛋糕和食谱一样不同
他还告诉我们堆栈应该包含字符串在堆中的地址
正确的;如果有一个短期变量或值是对堆上字符串的引用,那么该变量或值将存储在堆栈上。请注意,这是托管引用,而不是非托管引用
但是当他试图给我们看的时候,它不起作用,他也不知道为什么
也许他应该是那个在这里提问的人
我想知道如何操作,但当我尝试时,总是会收到以下错误消息:
对。不允许您像那样操纵托管引用
我在调试器中写入&nameofstringvariable
,不带引号
这将为您提供包含引用的变量的地址。它没有给你推荐信
看,你有一张纸上面写着“123芝麻街”。那是指房子。你把那张纸放在宾夕法尼亚大道1600号。当你问这张纸的地址时,它在宾夕法尼亚大道1600号,而不是芝麻街123号
无论如何,获取托管类型变量的地址是不合法的
我喜欢了解事情是如何运作的,我在谷歌上搜索了几个小时来解决这个问题,但我从未找到解决办法
你应该阅读C#规范的第18章。小心地
你也应该阅读我关于这个主题的所有文章,并让你的老师在你学习的时候阅读它们
所以现在有些问题你没有问:
因此,不可能获得对字符串的托管引用作为指针
对。在C语言中,不可能将托管引用作为指针
但我能做到
现在我有了一个指向字符串中第一个字符的指针。这不是一回事吗
当然不是!这是指向字符的非托管指针,而不是指向字符串的托管指针。面包盒中第一片面包的位置与面包盒的位置不同
在调试器中是否可以获取与字符串关联的托管地址
当然。查看内存窗口中的堆栈帧;其中一些值将是托管地址。您或您的老师可能会混淆C和C。实际上,您可以(但不应该)使用带有编译标志的“不安全”操作。在我的VS中,它可以显示字符串变量的地址。在即时窗口中,这是我的输出SS“Hello World”和SS0x064 3EB08 SS:0x020FB980i。它认为有点奇怪,你的老师甚至教你关于代码< >不安全的< /代码>代码。这是一个相当高级的主题,在大多数业务线应用程序中都是不必要的!lol抱歉,这不是你的错,这是一个非常好的答案,解释得很好,但因为我仍然是编程领域的初学者,所以我很难准确地理解我读到的内容。我会继续阅读以提高我的理解力。我下载了你推荐的C#规格。再次感谢@不客气。大多数人错误地学习了这些东西,后来不得不回去重新正确地学习(或者终生相信谎言)。现在是你正确学习所有这些东西的好时机。@EricLippert感谢你的解释和完美建议:“大多数人错误地学习了这些东西,后来不得不回去重新正确地学习(或者一生都在相信谎言)。”,即使多年后,我还是和朋友一起读了
string str = "Hello World";
fixed (char* p = str) { /*...*/ }