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编辑过]
----------------解决方案--------------------------------------------------------
如果光用释放掉了来解释?
那为什么用*p的时候,程序又没问题呢?
----------------解决方案--------------------------------------------------------
p[] = "Hello"; ``这个是开辟内存空间```只在函数体内有效```
*p = "Hello";``这个是定义一个变量``用这个变量指向一个字符串``
两个P都不一样```一个是常量``一个是变量``
对P[]```程序结束后```开辟的内存P[]回释放```所以`字符串就不存在了``
对*p```程序结束后``指针变量p也回释放``但是p的地址是肯定存在的``所以返回的这个地址``是指向你要的字符串的``
这是我的个人想法```不知道有没有人来``给给标准答案```
----------------解决方案--------------------------------------------------------
p[] = "Hello": 函数返回时可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,函数返回时其原先的内容已经被清除,新内容不可知
char *p="hello"相当于const char *p="hello":使p指向一个常量字符串,这个字符串"hello"位于内存的静态存储区GetMemory返回的是指向这个常量字符串的指针,这个字符串并未被销毁,所以str指向的区域是确定的
----------------解决方案--------------------------------------------------------
char *p="hello":在堆栈内为指针变量p分配了空间,并在数据段内为字串"hello"分配空间。
char temp[]="hello":在堆栈内为指针变量temp分配空间的同时在堆栈内为字串"hello"也分配了空间。 在函数GetMemory()调用以后,堆栈内的数据将会被修改掉.
而数据段内的字串尚未被修改
----------------解决方案--------------------------------------------------------
你如果很想用数组的话
可以改成
char a[]={"hello"};
这样就对了
----------------解决方案--------------------------------------------------------
请教:七楼的办法有什么根据?
我试了行不通.
谢谢
----------------解决方案--------------------------------------------------------
回6楼:
既然是用 *p="hello"; 会在静态存储区分配空间存放 "hello" ,同时会将"hello"的地址传给p,
那么函数返回时, p的空间会释放 hello的空间会不会释放?
如果会释放 那在返回主程序后str指向"hello",但这个"hello"所占的空间被系统回收,也就是说可以挪作他用。那以后再次使用str,所指向的内容还一定会是"hello"吗?会不会变成其他的内容?
如果不会释放 那多次调用这个getmemory()函数会不会造成系统资源流失?
----------------解决方案--------------------------------------------------------
#include<stdio.h>
int main()
{
char * str;
char p[] "Hollo"; /* 你把这个放到函数中去干什么 */
str = p;
printf(str);
}
----------------解决方案--------------------------------------------------------