社区
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收音机》是个开源的辅助工具,以后学技术更方便了!
...全文
272
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)
同
一个
电脑配置多个版本jdk并切换的方法和
疑惑
本文分享了如何在电脑上配置多个JDK版本,包括基础的环境变量法,进阶的JAVA_HOME设置,以及作者在配置过程中的
疑惑
,如命令行查询结果的刷新问题、注册表内容和Java文件的作用等。
为什么执行同
一个
程序
每次输出的变量地址是不一样的
本文通过
一个
简单
的C
程序
,探讨了地址空间随机化(ASLR)机制。在默认情况下,每次
程序
运行时,变量的内存地址都会随机变化,以增强安全性。通过禁用ASLR,可以观察到同一地址始终被分配给变量,但出于安全考虑,通常建议保持ASLR开启。
疑惑
: Go const 导致
程序
结果错乱 ?
本文通过
一个
营销活动的案例,揭示了在Go语言中使用无符号整数(uint)进行减法运算可能导致的意外结果。详细解释了原码、反码和补码的概念,以及无符号数在减法运算中的处理方式。同时,讨论了const关键字在类型转换中的特殊规则,指出const变量可以隐式转换为同族类型,这可能导致类型错误和不预期的结果。作者建议在编程时注意选择适当的变量类型,尤其是处理无符号整数的减法运算,以避免潜在问题。
自己的一些
疑惑
博客作者对map函数的使用存在
疑惑
,指出某种写法结果正确,map将int作用于序列,但另一种写法不行,单个情况又可以,初步怀疑是split导致问题,未明确具体原因。
疑惑
: Go const 会导致
程序
结果错乱 ?
本文探讨了Go语言中无符号整数在做减法运算时可能
出现
的异常结果,特别是在涉及const关键字时。通过示例代码,解释了补码运算原理以及无符号整数的类型转换规则。提醒开发者注意类型选择、取值范围以及const类型的隐式转换风险,以避免
程序
错误和逻辑bug。
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章