无法获取给定表达式的地址 ;C#指针
在不安全的上下文中考虑以下代码:无法获取给定表达式的地址 ;C#指针,c#,pointers,C#,Pointers,在不安全的上下文中考虑以下代码: 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();
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();
这很有效
根据我的要求,我应该能够替换我标记的行
fixed(char* start = &mySentence[0])
但不幸的是,VS给了我以下错误
无法获取给定表达式的地址
错误在我这边吗
VS.NET 2010 Premium。这不起作用,因为您试图访问字符串。如果您将代码更改为:
char[] mySentence = "Pointers in C#".ToCharArray();
fixed (char* start = &mySentence[0])
{
char* p = start;
do
{
Console.Write(*p);
}
while (*(++p) != '\0');
}
Console.ReadLine();
一切正常。mycentence[0]返回一个只读字符,您无法获取指向该字符的指针 使用: 相反 错误在我这边吗 没有;错误在您链接到的文档中。它说:
fixed (char* p = str) { /*...*/ } // equivalent to p = &str[0]
评论是不正确的;正如您正确指出的,获取字符串内部的地址是不合法的。获取数组内部的地址是唯一合法的
固定报表的法定初始值设定人为:
- 应用于变量引用的地址运算符
李>&
- 阵列
- 一串
- 固定大小的缓冲区
str[0]
不是变量引用,因为首先,字符串元素不是变量,其次,因为这是对索引函数的调用,而不是对变量的引用。它也不是数组、字符串或固定大小的缓冲区,因此它不应该是合法的
我会和文档经理聊一聊,看看是否能在以后的文档修订版中解决这个问题。谢谢你提醒我
更新:我已经和一位文档经理谈过了,他们告诉我,我们刚刚过了文档下一次计划修订的截止日期。建议的更改将在下一次修订后进入队列。hmmm。我没有收到那个错误!警告,不能保证.Net中的字符串以null结尾,它也可能包含null。您仍然应该使用MyEntence.Length字符串不是已经是字符数组了吗?他应该能够在不转换的情况下做到这一点。是和否,但您可以对其调用tocharray方法,只是为了明确。如果字符串已经是char数组,那么tocharray()方法的意义是什么?不是,您只能锁定字符串,不能锁定字符串元素。@MattDavey:我向您保证,您不能使用“fixed”语句获取任何托管类型的地址。见本规范第18.6节;它明确指出指针引用类型必须是fixed语句中的非托管类型。在修复字符串的情况下,所讨论的非托管类型是“char”,而不是“string”。你永远不能得到一个指向字符串的指针,只能指向一个字符。@Joan:这是一个合理的问题。这并不是说CLR可以自由地在任何地方存储字符;实际上,我们保证字符是连续的。相反,值类型包含它们的值,而引用类型不包含它们的值;CLR希望可以自由选择任何策略来管理引用类型的内部细节。比如,为什么每个引用类型的对象都知道它的类型?知道它的接口方法实现在哪里?等等有许多不同的策略可以将这些信息存储在内存中。感谢您更新文档并提供了很好的解释。
fixed (char* p = str) { /*...*/ } // equivalent to p = &str[0]