首页 新闻 搜索 专区 学院

各位大牛,.net如何通过指针(unsafe)修改字符串值?

0
悬赏园豆:30 [已解决问题] 解决于 2013-05-20 14:37

是这样的,我有一个字符串,我想不在申请内存的情况下,修改原字符串的值。我想到的办法是通过指针的方式直接修改值,但不知道怎么写,请大家指教,谢谢!

class Program
    {
        unsafe static void Main(string[] args)
        {
            string str = "admin";
            //我想将字符串修改为admni
            str = "admn";   //删除i
            str = "admni";//在最后插入i
            //这样不申请内存就将i和n调换了位置,请问用指针该如何实现?
         }
    }

请问这样如何实现啊?

Set sail的主页 Set sail | 小虾三级 | 园豆:540
提问于:2013-04-24 11:21
< >
分享
最佳答案
0

别用C的思维来想.NET。你可以直接写成str="admni",不会申请内存的。CLR中string是在托管堆中分配内存。既然你已经定义了一个string,说明你已经在托管堆中申请了内存。

收获园豆:10
呆呆蚁 | 菜鸟二级 |园豆:231 | 2013-04-24 11:59

是在堆中分配内存,但str="admni"不等于str="admin"需要两个不同的内存空间来存储这两个字符串,所以你这肯定是重新申请内存了

Set sail | 园豆:540 (小虾三级) | 2013-04-24 12:09

@Set sail: 正如3L所说,在CLR中String是不可变的,你只能分配另一个内存,并把指针赋给它。所有没有办法了。

呆呆蚁 | 园豆:231 (菜鸟二级) | 2013-04-24 16:45

@呆呆蚁: 

我觉得肯定是可以实现的,因为我可以通过指针直接修改内存中指定位置的值啊。

我的思路是,通过指针str="admin"获取str的地址,然后修改此地址的值。这样就能达到不申请空间而改变值了。

Set sail | 园豆:540 (小虾三级) | 2013-04-24 17:04
其他回答(2)
0

能问这样的问题也是大牛。不过我没在.net中用过指针,同样关注!

收获园豆:10
jerry-Tom | 园豆:4077 (老鸟四级) | 2013-04-24 14:06

--!

关注。。。

支持(0) 反对(0) Set sail | 园豆:540 (小虾三级) | 2013-04-24 17:06
0

跟c一样的,就是交换两个char的值嘛:

public static unsafe void Swap(ref string Str1,int i,int j)
    {
        if (Str1.Length < 1)
            return;
if(i>Str1.Length||j>Str1.Length||i==j)
return;

        
        fixed (char* pCh1 = Str1)
        {
            int* pChi1 = (int*)pCh1;
            pCh1[i] = pChi[j]+pCh1[i];
            pChi[j] = pChi[i]-pCh1[j];
            pChi[i] = pChi[i]-pCh1[j];
        }
    }

上面是意淫,因为string在.net里是不可变的,所以这段代码可能会导致clr crash。c#操作字符串比较好的方式就是尽量少创建string对象。不申请内存是不可能的,因为一开始的char[]就需要申请一个数组的空间,返回的新的string也需要重新申请。

收获园豆:10
today4king | 园豆:3267 (老鸟四级) | 2013-04-24 14:16

我觉得肯定是可以实现的,因为我可以通过指针直接修改内存中指定位置的值啊。

我的思路是,通过指针str="admin"获取str的地址,然后修改此地址的值。这样就能达到不申请空间而改变值了。

 

支持(0) 反对(0) Set sail | 园豆:540 (小虾三级) | 2013-04-24 17:04

@Set sail: 我就是按照你的思路写的代码,因为string的存在就是为了不可变的,你改了也许会成功但也可能会crash,我没说不可以。c#比较特别对某些类别的指针操作会不安全,这也是为什么关键字叫unsafe的原因。

支持(0) 反对(0) today4king | 园豆:3267 (老鸟四级) | 2013-04-25 10:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册