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

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