不安全的字符串指针语句

时间:2013-04-10 07:00:35

标签: c# .net unsafe fixed-statement

据我所知,根据MSDN C#,fixed语句应该像:

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

所以,为什么我不能这样做?

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

例如,如何获得指向str[1]的指针?

4 个答案:

答案 0 :(得分:7)

由于获取指向后一个元素的指针直接适用于数组,但不能使用字符串,因此似乎唯一的原因是MS没有实现它。按照数组的语义,可以很容易地设计它。

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

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

答案 1 :(得分:4)

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

C#中的

[]运算符与C中的[]不同。在C中,数组和字符串只是指针,并且在指针上应用[]运算符相当于移动指针并取消引用它。这不适用于C#。

实际上,您链接的MSDN文档中存在错误,已在latest version.

中修复

有关此问题的详细说明,请参阅here

答案 2 :(得分:1)

fixed语句的要点是防止内存分配在虚拟内存中移动。内存分配由其开头标识,而不是由任何其他地址标识。

为了保持&str[1]不变,您确实需要修复整个str;然后,您可以根据需要使用指针算法从固定指针到str的单个分配中派生其他指针。

答案 3 :(得分:0)

将您的代码更改为:

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