原创
关于字符串的内存地址
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中的。
以下是测试:
从四次打印输出来看,地址是一致的。
忆轻狂 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
jnsduzm_154034719 2014-6-4 09:28