关于字符串的内存地址

看到一篇博客,给出了下面一道关于C内存的笔试题:
char*getmemory(void)
{
char p[]="hello world";
return p;
}
void test(void)
{
char *str=null;
str=getmemory();
printf(str);
}
请运行test()函数,会有什么样的结果?
看完第一反应是输出"hello world"。但是,看了博主的解析,发现给出的答案是,输出乱码。
博主的分析详见:
http://www.eeskill.com/group/topic/id/1550
从他的角度分析的很好。
如果题目中将字符串改成是字符数组,我也会选择输出乱码,但是如果是字符串,就有些纠结了。
但是他在分析的时候都是以局部变量地址来讨论的,假设"hello world"位于栈中。
但是,由于字符串在C中相当于常量,而常量是在rodata段,并不在栈中。这个地址是一直存在的。题目中getmemory返回的已经不是栈中的地址,而是rodata段的地址。这也是为什么指向字符串的指针,无法修改其内容一样。
即:
char*getmemory(void)
{
char p[]="hello world";
p[0] = 'h';
return p;
}
会发生段错误提示。
在PC上还可能修改成功,但是在MCU中很可能是在FLash中的。
 
以下是测试:
 
从四次打印输出来看,地址是一致的。
本文纠错:http://www.eeskill.com/group/topic/id/1548
 
永不止步步 发表于09-30 15:35 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:307167个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号