关于return返回局部变量指针问题

613_BFS 2014-04-20 10:59:11

如图,为什么两个运行结果不同?求大神指导
...全文
587 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
果冻虾仁 2014-04-24
  • 打赏
  • 举报
回复
字符数组str。数组名str代表的是这个str[0]即第一个字符的地址,也就是说,如果你使用*str 那么它的值是一个字符的地址。如果你使用%s的话,那么就会出问题。 而显式的定义字符指针char * str 那么str指向的是一个字符串的首地址。若使用%s来输出那么可以得到正确结果。
mujiok2003 2014-04-21
  • 打赏
  • 举报
回复
不要返回局部变量的地址或引用
613_BFS 2014-04-21
  • 打赏
  • 举报
回复
引用 9 楼 u013163178 的回复:
#include <stdio.h>
char (& arry1())[12];
char * arry2();
int main(void)
{
	char *ch1,*ch2;
	ch1 =arry1();
	ch2 =arry2();
	printf("%s\n",ch1);
	printf("%s\n",ch2);
	
	return 0;
}
char (& arry1())[12]
{
	static char s[12]="Hello Word!";
	return s;
}
char *arry2()
{
	char *s="Hello Word!";
	return s;
}
-------------------------------------------------------------------------------------------------------------------------------------------
#include <stdio.h>
char * arry1();
char * arry2();
int main(void)
{
	char *ch1,*ch2;
	ch1 =arry1();
	ch2 =arry2();
	printf("%s\n",ch1);
	printf("%s\n",ch2);
	
	return 0;
}
char *arry1()
{
	static char s[12]="Hello Word!";
	return s;
}
char *arry2()
{
	char *s="Hello Word!";
	return s;
}
bingo!!!~~加static不释放局部变量
一根烂笔头 2014-04-21
  • 打赏
  • 举报
回复
我就不重复了,给你找了个帖子,你注重区分一下,栈区和静态数据段区的不同! http://blog.csdn.net/daiyutage/article/details/8605580
不要做咸鱼 2014-04-21
  • 打赏
  • 举报
回复
char * a ="helo"; char *b ="helo"; a==b char c []="helo"; a!=c;
漂浮一生 2014-04-20
  • 打赏
  • 举报
回复
刚刚又查了下相关资料,建议LZ去看看数据的存储方式 http://blog.sina.com.cn/u/2218913762
lm_whales 2014-04-20
  • 打赏
  • 举报
回复
返回的地址不一样,一个是常量字符串的存储地址,一个是局部变量的存储地址。 常量字符串的存储地址,读取是没有问题的,不可写; 局部非静态变量的存储地址,读写都很有问题。因为函数已经结束运行了。 那部分地址另有安排了。
Yalye 2014-04-20
  • 打赏
  • 举报
回复
ls说的对 array1中返回的字符数组为局部变量,函数结束后数组中数据内存被收回。 array2中str是指针, str被撤销,但是其指向的地址数据未改变,返回的地址中数据依然存在。
漂浮一生 2014-04-20
  • 打赏
  • 举报
回复
这个你要弄清楚常量和变量的概念,
char str1[] = "hello";
char *str2 = "hello";
1、return str1 返回的是一个临时变量的地址 2、str2指向的是一个常量字符串,return str2返回的是指向常量字符串的地址,是一直存在的 但这种做法不太好,一般是先动态分配一块内存,用完后free掉
lin5161678 2014-04-20
  • 打赏
  • 举报
回复
引用 1 楼 a515360208 的回复:
2、str2指向的是一个常量字符串,return str2返回的是指向常量字符串的地址,是一直存在的 但这种做法不太好,一般是先动态分配一块内存,用完后free掉
直接return字符串字面量 在C语言里面 没什么不好
li4c 2014-04-20
  • 打赏
  • 举报
回复
#include <stdio.h>
char (& arry1())[12];
char * arry2();
int main(void)
{
	char *ch1,*ch2;
	ch1 =arry1();
	ch2 =arry2();
	printf("%s\n",ch1);
	printf("%s\n",ch2);
	
	return 0;
}
char (& arry1())[12]
{
	static char s[12]="Hello Word!";
	return s;
}
char *arry2()
{
	char *s="Hello Word!";
	return s;
}
-------------------------------------------------------------------------------------------------------------------------------------------
#include <stdio.h>
char * arry1();
char * arry2();
int main(void)
{
	char *ch1,*ch2;
	ch1 =arry1();
	ch2 =arry2();
	printf("%s\n",ch1);
	printf("%s\n",ch2);
	
	return 0;
}
char *arry1()
{
	static char s[12]="Hello Word!";
	return s;
}
char *arry2()
{
	char *s="Hello Word!";
	return s;
}
613_BFS 2014-04-20
  • 打赏
  • 举报
回复
引用 2 楼 y_gemini 的回复:
ls说的对 array1中返回的字符数组为局部变量,函数结束后数组中数据内存被收回。 array2中str是指针, str被撤销,但是其指向的地址数据未改变,返回的地址中数据依然存在。
3Q
613_BFS 2014-04-20
  • 打赏
  • 举报
回复
引用 1 楼 a515360208 的回复:
这个你要弄清楚常量和变量的概念,
char str1[] = "hello";
char *str2 = "hello";
1、return str1 返回的是一个临时变量的地址 2、str2指向的是一个常量字符串,return str2返回的是指向常量字符串的地址,是一直存在的 但这种做法不太好,一般是先动态分配一块内存,用完后free掉
谢谢,现在大概有些了解了~
613_BFS 2014-04-20
  • 打赏
  • 举报
回复
引用 5 楼 richyhuang 的回复:
楼主这是啥开发环境,好奇特啊,跟我们的不一样
我用的Qt
richyhuang 2014-04-20
  • 打赏
  • 举报
回复
楼主这是啥开发环境,好奇特啊,跟我们的不一样

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧