社区
C++ 语言
帖子详情
char * 定义的字符串存放在何处?
执假以为真
2007-11-30 08:41:00
void main()
{
char * s = "aaa"; //本帖的问题就是"aaa"存放在何处?
s[0] = 'b'; // 为什么会使程序崩溃?难道"aaa"存放在全局区?如果是,为什么?
}
...全文
499
14
打赏
收藏
char * 定义的字符串存放在何处?
void main() { char * s = "aaa"; //本帖的问题就是"aaa"存放在何处? s[0] = 'b'; // 为什么会使程序崩溃?难道"aaa"存放在全局区?如果是,为什么? }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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存放在栈上,只想的内容在静态区(不可修改,所以崩溃)
视作串常量没有为什么
C语言
字符串
赋值给数组/
char
*
字符串
(c语言): 以“abcd”为例,解释如下: 1. 申请了空间(在常量区),
存放
了
字符串
2. 在
字符串
尾加上了'/0' 3. 返回地址 一定记清楚!! 1.
字符串
赋值给
char
* int main(int argc, const
char
*argv[]) {
char
*p1 = "hello"; printf("p1[0] = %c\n", *p1); printf("%s\n", p1);
char
*p2 = NULL; ...
指针
字符串
与 const
char
* 即const *
char
的详细使用讲解
指针
字符串
的使用问题 一、直接
定义
字符串
指针的使用注意事项
定义
字符串
指针的时候 const
char
*, 和
字符串
本身相同,就不会出现警告 const
char
* ==
char
const *, 作用:const
char
* p ,表示的是指针p指向的数值不能修改, 但是可以通过本身自己去修。 不能通过指针修改指针对应的数值,但是其对应的数值,可以通过本身修改 二、会出现警告的版本,能正常输出,但是不能修改 int main() {
char
*str = "hellow"
C++随手笔记(四)
char
字符、字符数组、
字符串
、
字符串
指针、string类型、const
char
* 、
char
const * 与
char
* const
1、字符与
字符串
字符型常量是用单引号包含起来的一个字符,如‘a’, ‘b’;
字符串
常量是用一对双引号包含起来的一堆字符,如"a"、”Hello word!" 等; ‘a’与“a”的区别: 字符 ‘a’ 在内存中占1字节, “a” 在内存中占2字节。“a” 的最后一个字符为’\0‘ ’\0‘ 是一个转义字符,标记
字符串
内容结束 变量
定义
与赋值:
char
c; c = 'a'; //正确 c = "a"; //错误,不能把一个
字符串
赋值给一个字符型变量
char
cc[] = "a"; //正确
C/C++中
char
*和
char
[]
定义
初始化
字符串
的区别!
char
*指针
定义
的
字符串
只能读不能修改;
char
[]
定义
的
字符串
可读可修改。 这是因为
char
*a = “abcd”; 此时"abcd"
存放
在内存的常量区。常量区只能读,而不可以修改。 而
char
a[20] = “abcd”; 此时 "abcd"
存放
在栈区。可以通过指针去访问和修改数组内容。 我们在编码过程中如果只是涉及到对
字符串
的读取,那么字符数组和
字符串
常量都能够满足要求,如果有写入(修改)操作,那么只能使用字符数组,不能使用
字符串
常量。 ...
C++
字符串
、string、
char
*、
char
[]、const
char
*的转换和区别
1.
字符串
字符串
本质就是一串字符,在C++中大家想到
字符串
往往第一反应是std::string(后面简称string)
字符串
得从C语言说起,string其实是个类,C语言是没有class的,所以C语言的
字符串
其实就是字符数组,也就是
char
[ ] ,例如:
char
str[10]; //
定义
了一个有十个元素的数组,元素类型为字符
char
char
str[10] = {"hel...
C++ 语言
64,282
社区成员
250,470
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章