(字符)常量在程序中的存在方式

竞天问 2011-01-13 01:37:50
如下的程序,输出结果是不确定的。我想问这个字符串常量是存放在程序的什么地方?
这个程序的详细执行过程是怎样的?

char* fun()
{
char a[] = "hello world";
return a;
}
void main()
{
cout<<fun()<<endl;
}

...全文
333 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
标哥 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chengzhe 的回复:]
注意char* a = "hello world"; 和 char a[] = "hello world";的区别

前者等价于const char* a, a指向了一个常量区, 是不会随着函数的结束而销毁的
而后者等价于char a[10]; strcpy(a, "hello world"); 显然a的内存实在栈上分配的, 函数结束自然会被释放。
[/Quote]
学习,原来是这样啊
learning8899 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jingtianwen 的回复:]
引用 10 楼 heguodong 的回复:
char* fun()
{
char* a = "hello world";
return a;
}
"hello world"不会存储在常量区,想一想外面可能修改a的内容就知道了
char *a=func();
a[1]='r';

可以正常执行,只能说明"hello world"占用的空间还没有被别的代码重写而已

我试过了……
[/Quote]

char *a=func();
a[1]='r';

这样赋值有问题,这里数组和指针不一样。指针作为函数参数时,和数组一样。
char *b;
char d[10];
b = fun();
strcpy(d,b);
d[1] = 'r';
printf("%s!%s!\n",b,d);


竞天问 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 heguodong 的回复:]
char* fun()
{
char* a = "hello world";
return a;
}
"hello world"不会存储在常量区,想一想外面可能修改a的内容就知道了
char *a=func();
a[1]='r';

可以正常执行,只能说明"hello world"占用的空间还没有被别的代码重写而已
[/Quote]
我试过了,会提示出错,我用的是VC++2008
learning8899 2011-01-13
  • 打赏
  • 举报
回复
刚才写错了,
char* fun()
{
char* a = "hello world";
return a;
}
==========
显式分配内存,和static char a[] = "hello world"不一样,后者下一次调用将覆盖着个数组的内容。
赵4老师 2011-01-13
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
learning8899 2011-01-13
  • 打赏
  • 举报
回复
char* fun()
{
char a[] = "hello world";
return a;
}
===========
这个是错误的,当函数结束时,这个变量被销毁,这个指针所指向的地址内容无法谁也不知道是什么。

char* fun()
{
return "hello world";
}
===========
这个没问题。

================
char* fun()
{
char* a = "hello world";
return a;
}
==========
显式分配内存,和static char a[] = "hello world"差不多,每次调用都会创建一个缓冲区,不会覆盖以前的返回值。缺点是程序员必须承担内存管理的责任。

gladstonejay 2011-01-13
  • 打赏
  • 举报
回复
这个问题每周都会出现好几次。。。
某某9 2011-01-13
  • 打赏
  • 举报
回复
会有个警告!
ezword 2011-01-13
  • 打赏
  • 举报
回复
估计再加上个static楼主会更晕。。。。
Jarrys 2011-01-13
  • 打赏
  • 举报
回复
局部变量存放在栈中的,当函数退出时,就会随着函数一起出栈。
heguodong 2011-01-13
  • 打赏
  • 举报
回复
char* fun()
{
char* a = "hello world";
return a;
}
"hello world"不会存储在常量区,想一想外面可能修改a的内容就知道了
char *a=func();
a[1]='r';

可以正常执行,只能说明"hello world"占用的空间还没有被别的代码重写而已
heguodong 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zeusuperman1 的回复:]
引用 5 楼 jingtianwen 的回复:
我又试了一下,

C/C++ code

char* fun()
{
char* a = "hello world";
return a;
}


是可以正常执行的,也就是说语句“char a[] = "hello world";”是以字符常量为初始值,又申请了相应长度的变量空间,而这个空间在函数返回时是会被销毁的


……
[/Quote]

这只是碰巧而已,不保证一定正确
食财物权情性 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jingtianwen 的回复:]
我又试了一下,

C/C++ code

char* fun()
{
char* a = "hello world";
return a;
}


是可以正常执行的,也就是说语句“char a[] = "hello world";”是以字符常量为初始值,又申请了相应长度的变量空间,而这个空间在函数返回时是会被销毁的
[/Quote]


lz你终于开窍啦,char a[] 会在栈内申请空间存放"hello world",因为是在fun里,退出fun的时候空间就被收回了。
char *a,是一个指向"hello world"字符常量的指针,文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。所以能被输出。
CJBAAA 2011-01-13
  • 打赏
  • 举报
回复
楼上说的很对
chengzhe 2011-01-13
  • 打赏
  • 举报
回复
注意char* a = "hello world"; 和 char a[] = "hello world";的区别

前者等价于const char* a, a指向了一个常量区, 是不会随着函数的结束而销毁的
而后者等价于char a[10]; strcpy(a, "hello world"); 显然a的内存实在栈上分配的, 函数结束自然会被释放。
竞天问 2011-01-13
  • 打赏
  • 举报
回复
我又试了一下,

char* fun()
{
char* a = "hello world";
return a;
}

是可以正常执行的,也就是说语句“char a[] = "hello world";”是以字符常量为初始值,又申请了相应长度的变量空间,而这个空间在函数返回时是会被销毁的
bdmh 2011-01-13
  • 打赏
  • 举报
回复
因为a[] 是数组,会被退化为指针进行处理,它是局部变量,作用域在fun过程中,fun结束后,就释放了
竞天问 2011-01-13
  • 打赏
  • 举报
回复
我原先是这样理解的:局部变量a指向的是字符串常量的存储地址,而这个地址是不变的,返回a也不应该有错,因为如果把fun()改成
char* fun()
{
return "hello world";
}
就可以正常运行。
显然这样理解是不对的,错在哪儿呢?
justkk 2011-01-13
  • 打赏
  • 举报
回复
有变量a的存储方式决定
此处a是一个局部临时变量,函数返回后,a被释放,函数返回的地址不再可用,结果是随机的
xiaozhuhaoa 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 jingtianwen 的回复:]
如下的程序,输出结果是不确定的。我想问这个字符串常量是存放在程序的什么地方?
这个程序的详细执行过程是怎样的?

C/C++ code

char* fun()
{
char a[] = "hello world";
return a;
}
void main()
{
cout<<fun()<<endl;
}
[/Quote]

char a[] 是在fun()过程中产生的。fun()结束了,char a[]就撤销掉了,而你返回的的指针,也就指向了一个撤销掉的a[]。你如何去打印它呢?

64,678

社区成员

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

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