谢谢你的指点
我转过来吧
问题内容:char *p="1234567890",这样的定义有问题吗
原讨论链接:http://community.
所属论坛:C语言
审核组:C/C++
提问者:wujie0978_cn
解决者:EnochShen
感谢:dongpy、jinus、goodluckyxl、21cnbao、EnochShen、whyglinux
关键字:
答案:
char *p="1234567890";
这个语句有什么毛病吗?
指针可以这样初始化吗???
如果可以的话:这个"1234567890"字符串系统会把它分配在内存什么地方?
---------------------------------------------------------------
这个"1234567890"字符串不再堆上也不在栈上!而是在文字常量区.而指针p在栈上
文字常量区:常量字符串就是放在这里的.程序结束后由系统释放.
比如:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
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"优化成一个地方。
}
---------------------------------------------------------------
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
---------------------------------------------------------------
>> char *p="1234567890";
>> 这个语句有什么毛病吗?
这个语句是有问题的,解释如下:
"1234567890"是一个字符串常量,C和C++的标准都规定:任何试图改变字符串常量的行为其结果是“未定义的”。但是上述语句的指针定义却不能阻止通过指针 p 来改变字符串常量"1234567890"的这种行为,比如:*p = 'a';,编译器发现不了这个错误。
正确的定义方式应该是:const char *p="1234567890";
>> 指针可以这样初始化吗???
回答又是可以的。由于历史的原因,标准在这一点上作了一些“妥协”:既允许字符常量指针自动转换为非常量指针。但是使用者应该知道这样做存在着上述问题。因为这个原因,C++标准把这种转换标记为“Deprecated”,应该避免使用。