先来看一下这行代码:
InBlock.gif#include <iostream.h>
InBlock.gif void main()
InBlock.gif{    
InBlock.gif   int i;
InBlock.gif   char *str = "abcde";
InBlock.gif   for(i=0; i < 5; i++)
InBlock.gif  {
InBlock.gif    str[i]-=32;
InBlock.gif    
InBlock.gif    cout << str[i] << "\n";
InBlock.gif  }    
InBlock.gif}
 
运行后出现这样的错误:
 
 
内存不能为写? 是哪里错了呢..调试了一下,原来是 str[i]-=32 这里错了 str的地址不能写入?为什么呢? 然后带着疑问用OD调试看了一下:
 
00428020=00428020 (ASCII "abcde")

STR的地址在00428020 看了下区段,是在rdata段,是只读段,难怪不能写入..心想,是不是改了他的属性就能写入了?问了下群里知道,有很多方法改段的属性,然后我就用VirtualProtect改STR地址的属性,下面是修改后的代码,可以正常运行:
InBlock.gif#include <iostream.h>
InBlock.gif#include <windows.h>
InBlock.gif void main()
InBlock.gif{    
InBlock.gif   int i;
InBlock.gif   char *str = "abcde";
InBlock.gif  DWORD pOld = 0;
InBlock.gif  VirtualProtect( str, 10, PAGE_READWRITE, &pOld );
InBlock.gif   for(i=0; i < 5; i++)
InBlock.gif  {
InBlock.gif    str[i]-=32;
InBlock.gif    
InBlock.gif    cout << str[i] << "\n";
InBlock.gif  }    
InBlock.gif  cout << pOld << "\n";
InBlock.gif}
 
怕自己忘了,做个笔记.新手学C++,高手不要笑!!!