值得思考_返回局部变量的地址
时间:2009-05-07 来源:hubo214
char * GetStr()
{
char *tmp;
tmp = "123"
return tmp;
}
void main()
{
printf("%s", GetStr());
}
会输出123吗?123创建在堆上还是栈上呢?123的空间是什么时候释放的?
会输出123。
tmp是GetStr()中的局部变量,是在栈中分配空间。
而“123”是一个字符串常量,是一个只读数据区的一个地址。
tmp = “123”;
把tmp的值附为“123”的地址
return tmp;
将tmp的值返回,也就是“123”的地址,而这段地址不会在GetStr()返回的时候释放。
所以在printf("%s", GetStr());时候会打出“123”
会输出“123”。
因为GetStr()返回的是字符串常量的地址,字符串常量存放在全局变量区,不会因为GetStr()地返回而被释放,而是在程序结束的时候释放。
要区分这两者
char * GetStr()
{
char *tmp;
tmp = "123"
return tmp;
}
和
char * GetStr()
{
char tmp[] = "123";
return tmp;
}
前者是对的, 后者是错的
。。。。。。
{
char *tmp;
tmp = "123"
return tmp;
}
void main()
{
printf("%s", GetStr());
}
会输出123吗?123创建在堆上还是栈上呢?123的空间是什么时候释放的?
会输出123。
tmp是GetStr()中的局部变量,是在栈中分配空间。
而“123”是一个字符串常量,是一个只读数据区的一个地址。
tmp = “123”;
把tmp的值附为“123”的地址
return tmp;
将tmp的值返回,也就是“123”的地址,而这段地址不会在GetStr()返回的时候释放。
所以在printf("%s", GetStr());时候会打出“123”
会输出“123”。
因为GetStr()返回的是字符串常量的地址,字符串常量存放在全局变量区,不会因为GetStr()地返回而被释放,而是在程序结束的时候释放。
要区分这两者
char * GetStr()
{
char *tmp;
tmp = "123"
return tmp;
}
和
char * GetStr()
{
char tmp[] = "123";
return tmp;
}
前者是对的, 后者是错的
。。。。。。
相关阅读 更多 +