原创 关于字符串的内存地址

2013-11-28 23:24 1299 19 23 分类: 消费电子
看到一篇博客,给出了下面一道关于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.51testing.com/html/51/10851-73167.html
从他的角度分析的很好。
如果题目中将字符串改成是字符数组,我也会选择输出乱码,但是如果是字符串,就有些纠结了。
但是他在分析的时候都是以局部变量地址来讨论的,假设"hello world"位于栈中。
但是,由于字符串在C中相当于常量,而常量是在rodata段,并不在栈中。这个地址是一直存在的。题目中getmemory返回的已经不是栈中的地址,而是rodata段的地址。这也是为什么指向字符串的指针,无法修改其内容一样。
即:
char*getmemory(void)
{
char p[]="hello world";
p[0] = 'h';
return p;
}
会发生段错误提示。
在PC上还可能修改成功,但是在MCU中很可能是在FLash中的。

以下是测试:
20131128232344283.jpg
20131128232357439.jpg
从四次打印输出来看,地址是一致的。

文章评论4条评论)

登录后参与讨论

忆轻狂 2014-6-10 23:43

多大算大,多小算小?我上一份工作公司也不小了,情况也是这样。说起来这不是公司规模问题,而是中国的管理思路的问题。我之前在中兴学习的时候也是这样子的。

longyuyunhui_808765867 2014-6-9 13:11

小公司工期短,什么都非常急促。不过楼主有责任心。未来肯定会更好。

用户1130179 2014-6-4 14:55

没有一个老板不想把产品做成一流的,但面对生存的艰难只能求其次!

yu_saisai_725130858 2014-6-4 12:54

多谢关心。

yu_saisai_725130858 2014-6-4 12:50

嗯,谢谢祝福。

用户912922 2014-6-4 12:42

祝福你!为梦想奋斗,我也要突破瓶颈,从新开始。

用户1685464 2014-6-4 10:55

我也毕业两年了。同样在一个小公司里两年。小公司的弊端也越来越影响工作的心情。最近打算辞职。一起加油。

用户1610239 2014-6-4 10:17

在这里找人才啊!呵呵

用户616501 2014-6-4 09:54

感觉楼主是个有责任心,上进心的人,这很可贵。我们公司(TUV莱茵合作伙伴)最近招聘电子产品认证工程师,有兴趣的可以和我联系。

jnsduzm_154034719 2014-6-4 09:28

和我的公司有点类似,小公司的风格都有相同之处吧,祝好运。
相关推荐阅读
catch2000 2015-07-19 11:44
信号线小电阻的作用
在一块新的PCB上,测试系统能否正常运行的时候,发现系统上电后没有正常启动。  系统框图如下:   在上电的时刻,CPU A(GPIO电平2.6V)会向串口发送启动日志数据,CPU A启动后,...
catch2000 2015-07-05 17:04
协议设计中ACK机制的影响
在TCP/IP中,延时ACK和Nagle算法。  TCP为了同时处理成块数据(通常为512字节的用户数据)和交互数据(通常用户数据比较少,例如不大于10个字节),采用了延时ACK和Nagle算法...
catch2000 2015-05-23 15:48
话说物联网操作系统
最近好多家都宣布推出自己的物联网操作系统。   1. Google将要在Google I/O大会发布的Brillo; 2. 三星推出的Artik芯片搭载Mentor Graphics的...
catch2000 2015-03-31 23:52
不要采用异或来交换两个变量
在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式: 方式一 {   x = x ^ y;   y = x ^ y;   x = x ^ y; } 而不是...
catch2000 2014-10-09 07:28
为什么要测试先行
在产品的研发过程中,测试一项至关重要。不论是软件还是硬件。   软件的测试先行,在研发过程中,就做到质量的保证,因为在出现Bug的时候,容易定位Bug,而且即使是在客户端出现Bug,也能够...
catch2000 2014-10-09 07:26
C语言的面向对象编程(一)
一、前言 对于编程而言,重要的是解决问题的方式,而不是语言本身。面向对象与面向过程是解决问题和思考问题的方式。C语言常说是面向过程开发的语言,因为其缺少很多对于面向对象特性的支持。但,这并不影...
我要评论
4
19
关闭 站长推荐上一条 /2 下一条