能力值:
( LV4,RANK:50 )
|
-
-
2 楼
调试一下就知道问题所在
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
汇编可能看到真相
char *c = "hello";
mov dword ptr [c],offset string "hello" (41573Ch)
*c = 0;
mov eax,dword ptr [c]
mov byte ptr [eax],0
char c[] = "hello";
mov eax,dword ptr [string "hello" (41573Ch)]
mov dword ptr [ebp-10h],eax
mov cx,word ptr ds:[415740h]
mov word ptr [ebp-0Ch],cx
*c = 0;
mov byte ptr [ebp-10h],0
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
楼上还是没有说清楚
mov eax,dword ptr [c]
mov byte ptr [eax],0
这两句会崩溃啊?
|
能力值:
( LV5,RANK:70 )
|
-
-
5 楼
"hello"在只读节,不能修改
会造成Access Violation
|
能力值:
( LV9,RANK:380 )
|
-
-
6 楼
你指针用不对而已。。
int main()
{
char *c = "hello";
c = (char *)'t';
return 0;
}
char *c = "hello";
*c 其实就是 hello 这串字母,而不是一个有效地址,所以你把 't'放到一个不存在的地址里,当然出错了。
总的来说呢,就是你对指针的概念理解不好
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
char *c = "hello";
等同于const char *c="hello"指向常量的指针。
确切的意思是:定义一个字符型指针c指向"hello"字符串的首字符,即'h';
因为“hello”是常量字符串,是不能被修改的,所以*c='t',试图想修改
"hello"字符串会出现错误;
而char c[]="hello";是定义一个C字符串数组,等同于下面:
char c[]={'h','e','l','l','o','\0'};
因此对*c='t',相当于 把这个字符数组的首字符'h'替换成了't';
这两个的区别楼主可以再好好理解一下~.
转
|
能力值:
( LV9,RANK:420 )
|
-
-
8 楼
有指针就会有奇迹
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
char *C定义为指针,而不是数组,因此char *c=“hello”只是将c指向常量“Hello”,而C为地址,当C=‘T’时就会向常量地址里写入。出现0x0005错误。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
看函数的堆栈就明白了。先看懂X86编码!
|
能力值:
( LV8,RANK:130 )
|
-
-
11 楼
加一行
#pragma comment(linker, "/section:.rdata,rw")
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
呵呵,学习了。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
也来学习了!
|
能力值:
( LV5,RANK:70 )
|
-
-
14 楼
/Gf /GF
VC6默认使用/Gf,这将字符串放入可写段
之后版本只能使用/GF,这将字符串放入只读段.
|
能力值:
( LV9,RANK:260 )
|
-
-
15 楼
char *c = "hello";
意思是c指向字符串常量,c是指针,不是数组,这是c语言基础。
至于字符串常量到底是不是真的常量,就要看对应的页面属性了,这个依编译器高兴而定,如果被放到了只读区里,当然改不了了。
DWORD dwOldProtect;
VirtualProtect( c, 4096,PAGE_READWRITE ,&dwOldProtect )
*c = 't';
先把页面属性改掉,这样就可以改了
|
能力值:
( LV5,RANK:70 )
|
-
-
16 楼
不考虑编译器的实际行为(实际上,一般情况你不应针对特定的编译器写特殊代码),ayunaa 的答案就是你需要的.
|
|
|