网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月25日
漏签
0
天
c语言吧
关注:
797,852
贴子:
4,338,675
看贴
图片
吧主推荐
视频
游戏
41
回复贴,共
1
页
<<返回c语言吧
>0< 加载中...
数组大小1024时,无法理解输出
只看楼主
收藏
回复
XuWeihui
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这次应该不是溢出问题了,求大佬看看
数组长度102时(正常)
数组大小1024时(不解)
XuWeihui
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
GTA小鸡
吧主
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
p2是函数内的局部变量,你试图在函数结束后引用其中的局部变量
你应该把结果通过参数传出,而不是return p2。
XuWeihui
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
数组不能直接作为一种返回值类型
ok冬天真的来了
酱油
4
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你这内存都释放了,还返回啥
贴吧用户_7eDa84e
低能力者
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
函数里的变量不用malloc在堆内存上创建的话都是创建在栈内存上的,函数执行完就会被销毁,你返回的看似是一个地址,但是地址对应的内存早就不是你函数里的地址了。
你可以用
char* p2=(char*)malloc(n*sizeof(char)):创建char数组,返回一个指针。记得包含头文件stdlib.h。还有不使用p2指向的内存后要free(指针)
XuWeihui
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这样就可以了:
func(char*p,char*p2,int n){
int i;
for(i=0;p[i];i++)
if(p[i]+3>'z'||(p[i]+3>'Z'&&p[i]+3<'a'))
p2[i]=(p[i]+3)-26;
else
p2[i]=p[i]+3;
p2[i]=0;}main(){
int n=1024;
char p[n],p2[n];
gets(p);
func(p,p2,n);
printf("%s\n",p2);
}
XuWeihui
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我本来想要的写法(返回整个数组是方法):
你们说的使用堆内存的方法(返回的不是数组而是数组名):
贴吧用户_aS7y5P2
毛蛋
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你这个编译能过吗?int n=1024应该改成const int
芯潶99319
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
1. 返回值不一定保存在eax寄存器中,因为eax寄存器只有4字节,最多保存4字节的内容。如果你返回的是一个大于4字节的内容,编译器是不会将其保存在eax之中的。
2.而你返回的是p2,p2是一个数组名,eax保存的是这个数组的内存地址,而不是整个数组。虽然你把数组的内存地址返回出去了。但是函数内部变量的内存在return之前就被收回了。也就是说你虽然拿到了内部变量的内存地址,但是该地址所指的内存空间已经失效了。
3.多看看书,这些书上都有,基础不牢,写程序就会漏洞百出。写程序不仅需要逻辑思维,还要懂一门语言的语法和各种坑。
芯潶99319
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
1. 八楼你的p2作为参数传入函数之中。参数p2里面储存的是fun函数外部数组的内存地址。
2. 为什么换成参数就没有问题,那是因为,p2是在main函数中声明的,main函数中的自动变量(指的是自动分配内存以及自动回收内存)的生命周期是整个程序的生命周期,在程序关闭时才会失效。而你在fun内部定义的数组,会在fun函数结束时就会失效。
3. 另外补充说一点,内存空间失效,不是说电脑内存无法读写了。而是说该内存的“租赁时间”到期了。租赁时间到期后,内存会处于两种可能的状态,一种是闲置状态,等待下一段代码或者另外的程序使用;另一种状态就是立马就有程序续租了。当失效内存处于闲置状态时,你去读写会得到正确的结果(此时还没有被别的代码改写数据)。但是如果别的代码占用了,你去读写就会导致错误的结果,因为别的代码会修改内存中原来的值。同时如果你改写了别人内存中的值,甚至会导致别的代码崩溃。因此操作失效内存是危险的行为。很多编译器会在编译阶段警告用户,当然也有一些编译器没那么聪明,这需要程序员自己检查。
这就是为什么你声明的数组大小为102时能够得到正确的结果,而数组大小是1024时结果错误的原因。因为数组越大,失效空间被其余代码复用的可能性就越大,你就越不可能得到正确的结果。
4. 你需要补充变量的作用域、生命周期、以及指针的相关知识。
XuWeihui
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你是不是看错了,我说的是八楼图1而不是7楼
起个名字
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
为什么可以不写函数的返回类型,我的vs还让我写
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示