Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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#指针_C#_Pointers - Fatal编程技术网

无法获取给定表达式的地址 ;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]