char * 定义的字符串存放在何处?

执假以为真 2007-11-30 08:41:00
void main()
{
char * s = "aaa"; //本帖的问题就是"aaa"存放在何处?
s[0] = 'b'; // 为什么会使程序崩溃?难道"aaa"存放在全局区?如果是,为什么?
}
...全文
499 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2007-12-03
  • 打赏
  • 举报
回复
“char* s”,s只是个指针,基本上任何地方的字符串,只要可以寻址,都可以被它指向。
在你的程序中,它指向了一个字面字符串,字面字符串一般放在程序的常量区,而不是在栈上。
执假以为真 2007-12-03
  • 打赏
  • 举报
回复
请问KenMark, xiaoQ008说是存放在文字常量区,这和你说的是一个意思吗?我如何去验证是存放在全局区还是文字常量区呢?
xyzyabcd 2007-12-02
  • 打赏
  • 举报
回复
顶楼上一下。讲的相当详细!!
xiaoQ008 2007-12-02
  • 打赏
  • 举报
回复
放P
谁说s在堆里
s在栈里
"aaa"在常量区
试图修改常量const s[0] 导致程序崩溃!
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 存放自动变量。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元由编译器自动释放,超出其作用域外的操作没有定义。栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限。栈存放函数的参数值,局部变量的值等。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 堆中的所有东西都是匿名的,这样不能按名字访问,而只能通过指针访问!
3、全局区(静态区)(static)—,内存在程序启动的时候才被分配,而且可能直到程序开始执行的时候才被初始化,如函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化。所分配的内存在程序的整个运行期间都存在,如全局变量,static变量等。
注意:初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过void*来访问和操纵,程序结束后由系统自行释放。
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
函数指针指向Code区,是程序运行的指令代码,数据指针指向Data,Heap,Stack区,是程序依赖以运行的各种数据

在文件作用域声明inline函数默认为static存储类型,const常量默认为static存储,如果加上extern,则为外部存储类型。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
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"优化成一个地方。
}
vincent_1011 2007-12-01
  • 打赏
  • 举报
回复
楼上的,既然你都改成数组了,就不需要p也可以修改了,真是的
visame 2007-12-01
  • 打赏
  • 举报
回复
"char *s=“aaa"; 字符指针变量s本身的地址存放在系统栈,而指针指向的内容"aaa"在静态常量区(用户不可修改区域)。
因此,s[0]='b'(企图修改指针指向的内容)失败导致程序崩溃。"
同意!
就呆在云上 2007-11-30
  • 打赏
  • 举报
回复
呵呵
因为指针的地址是游离的,你的程序指针指向了一个一个“字符型文字常量”,他在一个静态区里面,是不可以写的。
因此会出问题
让你的程序指向一个可以写的地方在写值吧
比如
int a[5];
int *p;
p=a;
p[0]='a';

这样是可以的,因为a的地址一个是个分配好了的,可以写的。
anmoi_yang 2007-11-30
  • 打赏
  • 举报
回复
char *s = "aaa"; 该表达是定义一个字符串常量, 故*s在全局变量区,指向栈区的"aaa"(局部变量区).

s[0] = 'b'; 会使程序崩溃是因为 字符串常量不能被修改.

<<高质量的C++编程>>对此有详细的描述.
我啃 2007-11-30
  • 打赏
  • 举报
回复
汗一个,堆都出来了,怎么不说在cache里面
gzlucky 2007-11-30
  • 打赏
  • 举报
回复
指针s在栈中,而字符串"aaa"在堆中。与静态变量一样存放。
我啃 2007-11-30
  • 打赏
  • 举报
回复
勘误VXD1
编译可过,运行出错
tangshuiling 2007-11-30
  • 打赏
  • 举报
回复
char *s=“aaa"; 字符指针变量s本身的地址存放在系统栈,而指针指向的内容"aaa"在静态常量区(用户不可修改区域)。
因此,s[0]='b'(企图修改指针指向的内容)失败导致程序崩溃。
VxD1 2007-11-30
  • 打赏
  • 举报
回复
指针s存放在堆栈区,"aaa"存放在普通内存区,
s[0] = 'b' 编译器禁止修改串常量,编译不能通过。这只是编译器的语法而己,假如编译通过的话,s[0]='b'是可行的,之所以不行,是因为c的语法限制而己
我啃 2007-11-30
  • 打赏
  • 举报
回复
void main()
{
char * s = "aaa"; //本帖的问题就是"aaa"存放在何处?
s[0] = 'b'; // 为什么会使程序崩溃?难道"aaa"存放在全局区?如果是,为什么?
}
这里的s存放在栈上,只想的内容在静态区(不可修改,所以崩溃)
视作串常量没有为什么

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧