读书人

为什么不允许改?解决方案

发布时间: 2012-04-16 16:20:04 作者: rapoo

为什么不允许改?
char *word="frame";
word[1]='1'; //为什么不能这样改

静态存储区的数据不是也可以改吗?static的不就是存储在静态存储区吗?


[解决办法]
char *word="frame";
是个字符串字面值,是个 常量字符串,所以不允许改,,。
[解决办法]
规定吧~~
[解决办法]

探讨
char *word="frame";
word[1]='1'; //为什么不能这样改

静态存储区的数据不是也可以改吗?static的不就是存储在静态存储区吗?

[解决办法]
char* word = "frame";

const char* word = "frame";
语义类似
[解决办法]
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放(就会造成内存泄漏的问题),程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(data), 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS,Block Started by Symbol)。 - 程序结束后有系统释放(在整个程序的执行过程中都是有效的)
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 (文字常量区内存页为只读属性)
5、程序代码区(code)—存放函数体的二进制代码。

二、例子程序
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈 //运行时把 "abc" 常量字符串拷贝到 char s[]
char *p2; 栈
char *p3 = "123456"; 123456/0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); // 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方
}

原帖地址:http://www.flatws.cn/article/program/embed/2011-06-17/31077.html


What's wrong with you ? char *p
1: 编译器
compiler 把形如 "stringany" 等等字符串识别为常量
所以形如line_1的写法是技术上的错误,虽然 MSVC v.6
可以编译通过.

2:两进制文件
在win32上,MSVC v.6 compiler/linker把"stringany"放在
exe的 .rdata section, 这个section的属性是 readable.

3: 内存映像
os的image loader加载exe到内存时,把这个section的内存页的属性设为
PAGE_READONLY.
由1,2,3,可知运行时任何对"stringany"的写入行为都将导致
一个 AV (access violation).

char *p = "Under The Bug"; // line_1: technical error, should be const char*p.

原文链接:http://bbs.et8.net/bbs/archive/index.php/t-438099.html

Windbg:
!address addr_str
可以看到 READ_ONLY 属性

读书人网 >C语言

热点推荐