Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在VisualStudio2010C中获取字符串的堆栈内存地址#_C#_Visual Studio 2010 - Fatal编程技术网

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) { /*...*/ }