社区
C语言
帖子详情
一个简单的程序,很疑惑为什么出现这样的结果
zodeee
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收音机》是个开源的辅助工具,以后学技术更方便了!
...全文
253
21
打赏
收藏
一个简单的程序,很疑惑为什么出现这样的结果
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收音机》是个开源的辅助工具,以后学技术更方便了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
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
打赏
举报
回复
你返回的是零时变量的地址
zodeee
2010-09-09
打赏
举报
回复
沙发自己强,肥水不留外人田!
绿色辅助工具——《Csdn收音机》帮你轻松掌握Csdn最新动向!
赵4老师
2010-09-09
打赏
举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
pengzhixi
2010-09-09
打赏
举报
回复
返回局部变量的指针,得到乱码是正常的,就怕输出正常让你认为可以这么返回
zodeee
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]
zodeee
2010-09-09
打赏
举报
回复
回下四楼的童鞋,辛苦了给我找出了那么多的错误,呵呵,那个头文件我拷贝的时候忘拷过来了,然后printf("%s,%s\n",str,str); 这里是想看看str的地址,有一点不明白的是我调试的时候看到str的指针地址真确的返回出来了,但是到printf的时候a指向的内容就突然变了,这是为什么呢
感谢你一直以来的支持,欢迎使用《Csdn收音机》!
zodeee
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在栈里分配的,函数返回了,可能已经释放了
加载更多回复(1)
Go 语言 入门 && 基于 GoLand 2023.1 创建第
一个
Go
程序
Go 语言 入门 && 基于 GoLand 2023.1 创建第
一个
Go
程序
Go 语言 入门 && 基于 GoLand 2023.1 创建第
一个
Go
程序
Go 语言 入门 && 基于 GoLand 2023.1 创建第
一个
Go
程序
Go 语言 入门 && 基于 GoLand 2023.1 创建第
一个
Go...
学了编程却写出错误代码?
程序
运行结果与想象不符?当bug
出现
时该何去何从,别担心,这篇文章统统告诉你!手把手带你调试代码,让bug原形毕露!
之前我们对C语言的知识进行了一一的讲解,但是当我们自己真正写代码的时候,又会发现很多问题,比如
程序
运行时崩溃、
程序
运行的结果不是我们想要的等等,虽然代码已经能够跑起来了,但是依然不是理想中的状态。...
python输出
一个
数组中只
出现
一次得数字_数组中只
出现
一次的数字
题目描述
一个
整型数组里除了两个数字之外,其他的数字都
出现
了偶数次。请写
程序
找出这两个只
出现
一次的数字。解题思路一种
简单
的思路,可以想到用HashSet这种数据结构来存,重复的就立即剔除,剩下的就是不重复的两...
微信小
程序
制作
一个
需要多少钱?创业老板们请坐下!咱们聊聊这笔账(超详细!)
微信小
程序
被很多老板看好,那做
一个
微信小
程序
到底要花多少钱呢?有人花三五千,有人直接砸到十几万!那这里面的猫腻是啥?咱今天就以
一个
大学生的角度,拆解出微信小
程序
制作的费用、坑点,以及网友们的真实“踩雷”...
一个
最
简单
的
程序
让你理解多径信道
时变、多径是无线信道的特点,相信很多人在看了很多书之后,对无线信道感觉还是一头雾水。为什么多径导致频率选择性...下面我们就用
一个
简单
的不能再
简单
的
程序
一一解开你的困惑。 首先,我们先说一下
程序
模拟的场...
C语言
70,035
社区成员
243,244
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章