2013-04-10 29 views
9

我的理解,根据MSDN C#固定的语句应该像:不安全字符串的指针声明

fixed (char* p = str) ... // equivalent to p = &str[0] 

这样,为什么我不能老是这样做呢?

const string str = "1234"; 
    fixed (char* c = &str[0]) 
    { 
/// ..... 
    } 

如何获取指向str[1]的指针?

+0

你会得到什么错误? – 2013-04-10 07:02:40

+0

编译时错误: 无法获取给定表达式的地址 – 2013-04-10 07:04:23

+0

可能的重复[无法获取给定表达式的地址\t C#指针](http://stackoverflow.com/questions/5079736/cannot-take-the- address-of-given-expressionc-pointer) – 2013-04-10 07:28:07

回答

4

这是因为字符串上的[]运算符是一个返回值的方法。当它是一个原始值类型时从方法返回值没有地址。

[]操作者在C#是不一样的,如C. []在C中,数组和字符串只是指针,并在指针施加[]操作,等效于移动指针和解除引用它。这不适用于C#。

其实有你链接的MSDN文档中的错误,即固定在latest version.

对这个确切的事情更多解释见here

+0

“方法的返回值没有地址。”不完全正确 - 只是发生了'string [int]'返回的是'char',它不是可以“固定”的类型。 – 2013-04-10 07:17:34

1

fixed语句的目的是防止内存分配在虚拟内存之间移动。内存分配由其开始标识,而不是由任何其他地址标识。

所以要保持&str[1]固定,你真的需要整个str固定;您可以使用指针算术来根据您的需要从固定指针到str的单个分配中派生其他指针。

0

你的代码改成这样:

char[] strC = "1234".ToArray(); 
fixed (char* c = &strC[0]) 
{ 
    /// ..... 
} 
+0

这给出了一个地址,该地址指向保存第一个字符的内存位置,但不能用于访问字符串的其他字符。 – 2013-04-10 07:14:01

7

由于获得一个指向后面元素直接与阵列工作,但不是用绳子好像唯一的原因是,MS没有实现它。按照数组的语义,很容易就可以像这样设计它。

但是,您可以轻松地计算指向其他数组元素的另一个指针。所以在实践中这不是一个大问题:

fixed (char* p = str) 
{ 
    char* p1 = p+1; 
}