如何修改字符串中的每一个成员(内存页面属性修改函数)

              当我们只需要修改  char *v1="abcde"中的‘a’为‘f’时,如果直接:v1[0]='f'的话,当程序运行时候就会出现异常:

             原因:char*型字符串数组所存储内存页的属性为只读型,通俗来说,就是属于只读数据域。当我们需要进行修改时。就必须将它所在内存页面改为既可以读也可以写数据的属性

               这里就要用到一个相关的函数:   VirtualProtect       内存页面属性修改函数 

              实现方法:

              1.   DWORD OldProject=0;

              2.   VirtualProtect(v1,0x1000,PAGE_READWRITE,&OldProject);

              3.  v1[0] = 'f';

               其中v1代表传入地址,0x1000代表一个内存页面的大小,PAGE_READWRITE代表修改当前属性为可读可写(READWRITE),后边是一个DWORD型传入的指针,用于保存修改前的属性(以前的属性为READONLY)

               在第三步后边可以加上:    VirtualProtect(v1, 0x1000, OldProject, &OldProject); 上一步已经说明OldProject已经保存了旧的属性,所以这次在原来PAGE_READWRITE的地方写上原来保存的属性,就修改为原来的属性。

               成功运行后结果:

        最后,需要注意的是,我所讲的是修改字符串中的某一个具体的元素,像v1[0]='f'用的是单引号

       如果是  char *v2="jiuh";

                     v1=v2;

        则这样是两个只读域的指针的变动,从而v1指向了v2,使得打印出来的是:jiuh   从而实现了“修改”

           

发布了37 篇原创文章 · 获赞 12 · 访问量 9268

猜你喜欢

转载自blog.csdn.net/weixin_43265881/article/details/90244999