看到一篇博客,给出了下面一道关于C内存的笔试题:
char*getmemory(void)
{
{
char p[]="hello world";
return p;
}
void test(void)
{
char *str=null;
str=getmemory();
printf(str);
}
return p;
}
void test(void)
{
char *str=null;
str=getmemory();
printf(str);
}
请运行test()函数,会有什么样的结果?
看完第一反应是输出"hello world"。但是,看了博主的解析,发现给出的答案是,输出乱码。
博主的分析详见:
从他的角度分析的很好。
由于char p[]="hello world";是定义了一个字符数组,并使用"hello world"初始化其内容,sizeof(p)是12字节,p是栈中。
所以返回的时候,p的空间被释放了,返回的指针指向的地址已经无效。所以输出为乱码。
但是,如果修改为char *p="hello world";则会正常打印"hello world"。原因如下:
这里定义了一个指针p,p指向"hello world"的首地址。由于字符串在C中相当于常量,而常量是在rodata段,并不在栈中。这个地址是一直存在的。这也是为什么指向字符串的指针,无法修改其内容一样。
即:
char*getmemory(void)
{
{
char *p="hello world";
p[0] = 'h';
return p;
}
return p;
}
会发生段错误提示。
以下是测试:


从四次打印输出来看,地址是一致的。