在不安全的上下文中考虑以下代码:
string mySentence = "Pointers in C#";
fixed (char* start = mySentence) // this is the line we're talking about
{
char* p = start;
do
{
Console.Write(*p);
}
while (*(++p) != '\0');
}
Console.ReadLine();
这很好用。
根据http://msdn.microsoft.com/en-us/library/f58wzh21(v=VS.100).aspx,我应该可以替换标有
的行fixed(char* start = &mySentence[0])
但不幸的是VS给了我以下错误。
无法获取给定表达式的地址
我的错误是什么?
VS.NET 2010 Premium。
答案 0 :(得分:12)
我的错误是什么?
没有;错误发生在您链接到的文档中。它声明:
fixed (char* p = str) { /*...*/ } // equivalent to p = &str[0]
评论不正确;正如您所记录的那样,获取字符串内部的地址是不合法的。获取数组内部的地址是合法的。
固定声明的合法初始化者是:
&
应用于变量引用。 str[0]
不是变量引用,因为首先,字符串元素不是变量,其次,因为这是对索引函数的调用,而不是对变量的引用。它也不是数组,字符串或固定大小的缓冲区,因此它不应该是合法的。
我将与文档管理员聊聊,我们将看看是否可以在以后的文档修订版中修复此问题。谢谢你引起我的注意。
更新:我已经与其中一位文档管理员交谈,他们告诉我,我们刚刚通过了下一次计划修订文档的截止日期。建议的更改将在下一个版本的队列中进行修订。
答案 1 :(得分:2)
这不起作用,因为您正在尝试访问字符串。如果您将代码更改为:
char[] mySentence = "Pointers in C#".ToCharArray();
fixed (char* start = &mySentence[0])
{
char* p = start;
do
{
Console.Write(*p);
}
while (*(++p) != '\0');
}
Console.ReadLine();
一切都会正常。
答案 2 :(得分:0)
mySentence [0]返回一个只读单个字符,你无法获得指向该字符的指针。
使用:
fixed(char* start = &mySentence)
代替。