一个简单的程序,很疑惑为什么出现这样的结果

zhichai003 2010-09-09 12:23:26
char* getstr()
{
char str[5];

strcpy(str, "abcd");
printf("%d,%s\n",str,str);

return str;

}

int main()
{
char* a = getstr();

printf("%s",a);
return 0;
}
结果却是乱码,调试的时候发现到printf的时候a指向的值这么就突然变了呢?

《Csdn收音机》是个开源的辅助工具,以后学技术更方便了!
...全文
166 点赞 收藏 21
写回复
21 条回复
cbib_cat 2010年09月10日
返回的是临时变量的地址
回复 点赞
evoloyeu 2010年09月10日
[Quote=引用楼主 zhichai003 的回复:]
char* getstr()
{
char str[5];

strcpy(str, "abcd");
printf("%d,%s\n",str,str);

return str;

}

int main()
{
char* a = getstr();

printf("%s",a);
return 0;
}
结果却是乱码,调试的时候……
[/Quote]
char* getstr()返回的是一个局部变量啊
回复 点赞
Csuxiaowu 2010年09月09日
你返回的是零时变量的地址
回复 点赞
zhichai003 2010年09月09日
回复 点赞
赵4老师 2010年09月09日
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
回复 点赞
pengzhixi 2010年09月09日
返回局部变量的指针,得到乱码是正常的,就怕输出正常让你认为可以这么返回
回复 点赞
zhichai003 2010年09月09日
呵呵,单步看了,就是不明白怎么就会突然变了,呵呵,现在明白了
[Quote=引用 17 楼 qrp_pig 的回复:]
1、
函数反回时,会将函数中的临时变量出栈,所以str在char* getstr()函数返回时,已经出栈;
即其他数据可以占用该地址;返回main函数后,其他数据占用了该地址;所以打印时输出乱码;
2、
建议多看看编译器的warning,
3、
函数的几种更改方式:
(1)char str[5];声明为全局变量;
#include <stdio.h>
#include <stri……
[/Quote]

Csdn好帮手——《Csdn收音机》即使监视社区动态!
回复 点赞
周靖峰 2010年09月09日
str在栈上,函数结束str也被释放了
回复 点赞
liutengfeigo 2010年09月09日
返回临时变量的地址?
回复 点赞
walkersfaint 2010年09月09日
数组改为指针即可
回复 点赞
qrp_pig 2010年09月09日
1、
函数反回时,会将函数中的临时变量出栈,所以str在char* getstr()函数返回时,已经出栈;
即其他数据可以占用该地址;返回main函数后,其他数据占用了该地址;所以打印时输出乱码;
2、
建议多看看编译器的warning,
3、
函数的几种更改方式:
(1)char str[5];声明为全局变量;
#include <stdio.h>
#include <string.h>

char str[5];

char* getstr()
{
strcpy(str, "abcd");
printf("%d,%s\n",str,str);
return str;

}

int main()
{
char* a = getstr();

printf("%s",a);
return 0;
}

因为str不是局部变量,所以地址不会被侵占,篡改,输出结构会正确;

方式二、
使用静态变量,内存地址不会被释放

#include <stdio.h>
#include <string.h>

char* getstr()
{
static char str[5];
strcpy(str, "abcd");
printf("%d,%s\n",str,str);
return str;

}

int main()
{
char* a = getstr();

printf("%s",a);
return 0;
}

方式三,函数参数传递
#include <stdio.h>
#include <string.h>
#include <MALLOC.H>

void getstr( char *str )
{
strcpy(str, "abcd");
printf("%d,%s\n",str,str);
}

int main()
{
char* a ;

a = ( char *) malloc (sizeof(char)) ;

getstr(a);

printf("%s",a);

// free(a) ;
return 0;
}

抛砖引玉一下,呵呵

4、楼主其实应该单步调试跟踪一些str地址数据,看看有什么神奇变化的
回复 点赞
极夜之辉 2010年09月09日
三楼、六楼都是对的
回复 点赞
eagleatustb 2010年09月09日
但是到printf的时候a指向的内容就突然变了,这是为什么呢

因为地址返回来了,但是那个地址上的内容已经结束了他getstr()里的生命周期,已经在getstr()返回的时候自动释放了这块空间,里面的内容在你再指向使用的时候就不确定,所以出现乱码.
[Quote=引用 14 楼 zhichai003 的回复:]
回下四楼的童鞋,辛苦了给我找出了那么多的错误,呵呵,那个头文件我拷贝的时候忘拷过来了,然后printf("%s,%s\n",str,str); 这里是想看看str的地址,有一点不明白的是我调试的时候看到str的指针地址真确的返回出来了,但是到printf的时候a指向的内容就突然变了,这是为什么呢

感谢你一直以来的支持,欢迎使用《Csdn收音机》!
[/Quote]
回复 点赞
zhichai003 2010年09月09日
回下四楼的童鞋,辛苦了给我找出了那么多的错误,呵呵,那个头文件我拷贝的时候忘拷过来了,然后printf("%s,%s\n",str,str); 这里是想看看str的地址,有一点不明白的是我调试的时候看到str的指针地址真确的返回出来了,但是到printf的时候a指向的内容就突然变了,这是为什么呢

感谢你一直以来的支持,欢迎使用《Csdn收音机》!
回复 点赞
zhichai003 2010年09月09日
我知道用用指针可以得到正确地址,但是不明白为什么用那个就会出现这个结果,看了六楼和十一楼的答案明白了,收获了,谢谢啦

《Csdn收音机》在线检测最新版本,让你永不过期!
回复 点赞
十八道胡同 2010年09月09日
char* getstr()
{
char str[5]; //这个事临时变量,当退出该函数时,该变量就作废了

strcpy(str, "abcd");
printf("%d,%s\n",str,str);

return str;

}
回复 点赞
hei鹰 2010年09月09日
对不起,我给你回答问题是鼠标按得太快了,还有一点需要补充的(看下面):
#include "stdio.h" //首先你没有加两个头文件;
#include "string.h" //你用到了strcpy函数就必须用到此头文件;
char* getstr()
{
char str[5];

strcpy(str, "abcd");
printf("%s,%s\n",str,str); //还有这边,你要把%d 改为%s,因为你输出的是字符串;

return str; //在c程序的函数体中,当数组定以后,系统便自动为数字开辟存储空间,但是但当这个函数结束时,它就会撤销这块存储空间,它的作用域只在{ }函数体的这对花括号内;所以这边返回的地址(str)是个无效地址,所以当你回到main函数中时,a所指向的使系统随机分配的内存地址,这必然会使得a的输出结果是个随机值即乱码;

}

int main()
{
char* a = getstr();

printf("%s",a);
return 0;
}


你把这个程序修改成如下所示,就可以得到正确结果了;
#include "stdio.h" //首先你没有加两个头文件;
#include "string.h" //你用到了strcpy函数就必须用到此头文件;
char* getstr()
{
char str[5];

strcpy(str, "abcd");
printf("%s,%s\n",str,str); //还有这边,你要把%d 改为%s,因为你输出的是字符串;
printf("%s\n",str);
return str;

}

int main()
{
char* a = getstr();


return 0;
}
回复 点赞
hei鹰 2010年09月09日
#include "stdio.h" //首先你没有加两个头文件;
#include "string.h" //你用到了strcpy函数就必须用到此头文件;
char* getstr()
{
char str[5];

strcpy(str, "abcd");
printf("%s,%s\n",str,str); //还有这边,你要把%d 改为%s,因为你输出的是字符串;

return str;

}

int main()
{
char* a = getstr();

printf("%s",a);
return 0;
}
回复 点赞
csdayu 2010年09月09日
3楼正解
回复 点赞
wyfwx 2010年09月09日
str在栈里分配的,函数返回了,可能已经释放了
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告