http://blog.sina.com.cn/s/blog_4c258ba00100eada.html
http://www.cnblogs.com/thinkingfor/archive/2013/07/03/3170070.html
#include <stdio.h>
void main()
{
char * c = "hello";
printf("%s\n",c);
}
总结下:char * c = "hello"; c是个分配在堆栈中的一个变量。里面装的是字符串hello的首地址,而hello是常量区。PE文件在编译的时候就确定了的。
下面再来看char c[]="hello"
#include <stdio.h>
void main()
{
char c[] = "hello";
printf("%s\n",c);
}
上面我只是用"hello"做例子,如果是helloworld放入char c[]呢,那会是这样的。
dword ptr[ebp-c]="hell" dword ptr[ebp-8]="owor" word ptr[ebp-4]="ld"这样放。
总结下:
也就是说char []c = "hello";
"hello"是放在堆栈中保存的,跟上面的那个例子不同,由于hello是堆栈中的所以是可以修改的。而常量区里的是不可以修改的。因为PE的内存页属性是只读的。当然可以有办法强行修改它。那属于HACK技术了。
那c保存在哪里呢?c根本在内存中不存在,只是编译器的一个标记,用于编译期来计算地址用的。用完就不要了。
总结:
char *c = "hello";
*c = 't'; //错误
char c[] = "hello";
c[0] = 't'; //正确