当我们只需要修改 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 从而实现了“修改”