鱼C论坛

 找回密码
 立即注册
查看: 2543|回复: 8

求高手帮忙解释一下为什么不一样?!

[复制链接]
发表于 2014-3-4 23:03:27 | 显示全部楼层 |阅读模式
10鱼币
如题:这样编写就能打印正确?请主要看红色部分:(小甲鱼的C语言的48课的课后题)方法一:

#include<stdio.h>

void main()
{
        double score[][4]={60.0,70.0,80.5,90.5,56.0,89.0,67.0,88.0,34.2,78.5,90.5,100};
        double *search(double (*pointer)[4]);
        int *p;

        printf("不合格的学生是:");
        p=search(score);
        printf("%d %d",*p,*(p+1));这种方法能正确打印。而下面我分开打印时*(p+1)的值就不对了!为什么呢?
        printf("\n");
}

double *search(double (*pointer)[4])
{
        int i,j;
        int k[3],m=0;
       
        for(i=0;i<3;i++)
        {
                for(j=0;j<4;j++)
                {
                        if(*(*(pointer+i)+j)<60.0)
                        {
                                k[m]=i;
                                m++;//printf("%d ",i);
                        }
                }
        }
       
        return k;
}





方法二(非正确方法):
#include<stdio.h>

void main()
{
        double score[][4]={60.0,70.0,80.5,90.5,56.0,89.0,67.0,88.0,34.2,78.5,90.5,100};
        double *search(double (*pointer)[4]);
        int *p;

        printf("不合格的学生是:");
        p=search(score);
        printf("%d %d",*p);//这个值和上面一样
        printf("%d",*(p+1));//这个值就不对了,不知道为什么?求高手解答一下!
        printf("\n");
}

double *search(double (*pointer)[4])
{
        int i,j;
        int k[3],m=0;
       
        for(i=0;i<3;i++)
        {
                for(j=0;j<4;j++)
                {
                        if(*(*(pointer+i)+j)<60.0)
                        {
                                k[m]=i;
                                m++;//printf("%d ",i);
                        }
                }
        }
       
        return k;
}





最佳答案

查看完整内容

首先你的程序写的有几处问题: 1:search函数double类型返回int型指针 2:search函数执行完毕,栈变量的内存引用会被释放,就是你main中获取到search的返回值,那也是不对的,释放的栈数据随时被系统征用 3:想得到函数返回而不会被释放,你可以返回score这个二维数组的地址 你先修改下代码,search可以再传递一个指针进去,获取不及格的成绩地址,返回值可以去掉,就没问题了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-4 23:03:28 | 显示全部楼层
首先你的程序写的有几处问题:
1:search函数double类型返回int型指针
2:search函数执行完毕,栈变量的内存引用会被释放,就是你main中获取到search的返回值,那也是不对的,释放的栈数据随时被系统征用
3:想得到函数返回而不会被释放,你可以返回score这个二维数组的地址

你先修改下代码,search可以再传递一个指针进去,获取不及格的成绩地址,返回值可以去掉,就没问题了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-4 23:54:22 | 显示全部楼层
search函数所占内存是分配的,调用完后就被回收了,所以你返回地址是没有意义的,应该用malloc或者static。至于第一种方法也是危险的(调试时有一个警告),不过可能是编译器原理问题,第一条printf的结果是对的。-------本人愚见,请多赐教。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-5 15:15:04 | 显示全部楼层
第二个方法的第一个printf()方法多了一个%d
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-5 20:55:33 | 显示全部楼层
上面三楼说的是对的,你那k[] 声明为全局变量,不管上面那种输出都对。  (我用的是在线编译,我用malloc给变量P声明空间没用,而将方法一中的search中的printf注释去掉,显示正常,方法二中search中的printf注释去掉,只有第一个数正常。方法一中 将 p=search(score);  printf("%d %d",*p,*(p+1)); 用任意代码,如printf(“/n”)隔开,同时search中的printf注释去掉,显示不正常。    所以search函数中k[]变量在search执行完后就清除了,如果search中执行了printf函数k[]变量会在search函数执行完后保留一小段时间....)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-5 21:00:47 | 显示全部楼层

大部分明白了。就是因为栈释了吧。非常感谢你的解答。但还有一点不明白:为什么第一个能够正确的打印呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-5 21:49:21 | 显示全部楼层
隨鈊乄鎍慾 发表于 2014-3-5 21:00
大部分明白了。就是因为栈释了吧。非常感谢你的解答。但还有一点不明白:为什么第一个能够正确的打印呢?

你的栈内存若是没有被系统使用,里面的数据暂时还是你要的,只是这些数据已经是垃圾数据了,系统随时会使用,如果系统还没使用,里面的数据当然你可以访问得到!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-5 22:50:36 | 显示全部楼层
超级忍者龟 发表于 2014-3-5 21:49
你的栈内存若是没有被系统使用,里面的数据暂时还是你要的,只是这些数据已经是垃圾数据了,系统随时会使 ...

哦,原来如此!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-5 22:51:53 | 显示全部楼层
亲。。。你都学了这么久了。。还这水平。。。→_→。。。我都不想吐槽了。。。你不是要写WG嘛。。我记得你以前给我说过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 10:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表