社区
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收音机》是个开源的辅助工具,以后学技术更方便了!
...全文
242
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
作业
写回复
配置赞助广告
用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
程序
Go 语言 入门 && 基于 GoLand 2023.1 创建第
一个
Go
程序
Go 语言 入门 && 基于 GoLand 2023.1 创建第
一个
Go
程序
Go 语言 入门 && 基于 GoLand 2023.1
python输出
一个
数组中只
出现
一次得数字_数组中只
出现
一次的数字
题目描述
一个
整型数组里除了两个数字之外,其他的数字都
出现
了偶数次。请写
程序
找出这两个只
出现
一次的数字。解题思路一种
简单
的思路,可以想到用HashSet这种数据结构来存,重复的就立即剔除,剩下的就是不重复的两个数字,将其取出即可。 //num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.*;public class So...
一个
最
简单
的
程序
让你理解多径信道
原文地址:https://wenku.baidu.com/view/f4bb76fe941ea76e58fa044d.html 时变、多径是无线信道的特点,相信很多人在看了很多书之后,对无线信道感觉还是一头雾水。为什么多径导致频率选择性?为什么多普勒频移反映了信道的时变性?对这些问题感觉困惑的肯定大有人在。下面我们就用
一个
简单
的不能再
简单
的
程序
一一解开你的困惑。 首先,我们先说一下
程序
模拟的场...
如何判断一段
程序
是否是裸机
程序
?
哈,很多人会问,为什么100us的查询不直接在while1那里一直查询?因为在100us查询的话,我们可以相对准确的设定我们的查询时间和次数。第二、
程序
想到哪写到哪,每个
程序
都能单独的进行运行和测试。如果能使用指针函数,全局变量都不需要使用,要定位问题时,可以先一些
程序
注释掉,先不运行,也妨碍其他
程序
运行。第三、为以后使用RTOS打下基础。开始学会怎么划分任务,任务怎么通讯。以后用上了RTOS后,每个
程序
变成RTOS的任务就行了。对于学习RTOS我认为有好处。
微信小
程序
制作
一个
需要多少钱?创业老板们请坐下!咱们聊聊这笔账(超详细!)
创业路上的第一步,有人说是“迈出去”,但很多时候,是掏出钱包。微信小
程序
被很多老板看好,那做
一个
微信小
程序
到底要花多少钱呢?有人花三五千,有人直接砸到十几万!那这里面的猫腻是啥?咱今天就以
一个
大学生的角度,拆解出微信小
程序
制作的费用、坑点,以及网友们的真实“踩雷”案例!一、“微信小
程序
?啊,这不是挺
简单
的吗?”——真相可没那么美不知道大家有没有这种感觉,刷视频的时候,总看到有老板或博主分享说:“我们公司搞了个小
程序
,轻轻松松上线,客户爱用得很!
C语言
70,023
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章