网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月06日漏签0天
c语言吧 关注:798,954贴子:4,358,217
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 41回复贴,共1页
<<返回c语言吧
>0< 加载中...

数组大小1024时,无法理解输出

  • 只看楼主
  • 收藏

  • 回复
  • XuWeihui
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这次应该不是溢出问题了,求大佬看看
数组长度102时(正常)

数组大小1024时(不解)


  • XuWeihui
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼





2025-08-06 03:43:34
广告
不感兴趣
开通SVIP免广告
  • GTA小鸡
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
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
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我本来想要的写法(返回整个数组是方法):

你们说的使用堆内存的方法(返回的不是数组而是数组名):


2025-08-06 03:37:34
广告
不感兴趣
开通SVIP免广告
  • 贴吧用户_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
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 41回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示