先来看一下这行代码:
#include <iostream.h>
void main()
{
int i;
char *str = "abcde";
for(i=0; i < 5; i++)
{
str[i]-=32;
cout << str[i] << "\n";
}
}
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地址的属性,下面是修改后的代码,可以正常运行:
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";
}
#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++,高手不要笑!!!
转载于:https://blog.51cto.com/yiban/208956