char *GetMemory(void)
{
char p[] = "Hello"; //如果把这里换成char *p = "Hello";就可以
return p;
}
int main()
{
char *str = NULL;
str = GetMemory();
printf(str);
}
为什么char p[] 的时候就不行,我看的解释是说在GetMemor定义的为局部变量,返回时p就已经释放,我有点不明白
换成*p为什么就可以了呢?难道那个时候指针p不会被释放吗?
谢谢各位了
char *GetMemory(void)
{
char p[] = "Hello";
return p;
}
p 的作用域仅限于 GetMemoru() 函数中。
p 是空链接的。
返回 p 是可以的,但 p 指向的那个字符串已经不存在了。因为函数已经结束了。
char p[] = "Hello"; 是进入函数后分配内存空间的,函数结束分配的内存空间释放了。
//------------------------//---------------------------------------------------//
// C 的 5 种存储类 //
//------------------------//
存储类 时期 作用域 链接 声明方式
自动 自动 代码块 空 代码块内,可选使用关键字auto
寄存器 自动 代码块 空 代码块内,使用关键字 register
具有外部链接的静态 静态 文件 外部 所有函数之外
具有内部链接的静态 静态 文件 内部 所有函数之外,使用关键字 static
空链接的静态 静态 代码块 空 代码块内,使用关键字 static
//----------------------------------------------------------------------------//
#include <stdio.h>
char * hello(void)
{
char p[] = "Hello"; /* p 是数组首元素的地址 */
/* 其实就是 p[6] = "Hello" */
return p;
}
char * hel(void)
{
char *p = "Hello"; /* p 指向一个字符串 */
return p;
}
int main(void)
{
printf("%s\n", hello());
printf("%s\n", hel());
getchar();
return 0;
}
/* char p[] = "Hello"; 这种形式只是为了方便初始化字符数组 */
/* 你不希望这样初始化吧:char p[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; */
[此贴子已经被作者于2007-11-9 13:32:27编辑过]