隨鈊乄鎍慾 发表于 2014-3-4 23:03:27

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

如题:这样编写就能打印正确?请主要看红色部分:(小甲鱼的C语言的48课的课后题)方法一:
#include<stdio.h>
void main()
{
        double score[]={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));
        int *p;

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

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



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

void main()
{
        double score[]={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));
        int *p;

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

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





超级忍者龟 发表于 2014-3-4 23:03:28

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

你先修改下代码,search可以再传递一个指针进去,获取不及格的成绩地址,返回值可以去掉,就没问题了!

zhongguoren 发表于 2014-3-4 23:54:22

search函数所占内存是分配的,调用完后就被回收了,所以你返回地址是没有意义的,应该用malloc或者static。至于第一种方法也是危险的(调试时有一个警告),不过可能是编译器原理问题,第一条printf的结果是对的。-------本人愚见,请多赐教。

xiaoxin 发表于 2014-3-5 15:15:04

第二个方法的第一个printf()方法多了一个%d

tsp150600 发表于 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函数执行完后保留一小段时间....)

隨鈊乄鎍慾 发表于 2014-3-5 21:00:47

超级忍者龟 发表于 2014-3-4 23:29 static/image/common/back.gif
首先你的程序写的有几处问题:
1:search函数double类型返回int型指针
2:search函数执行完毕,栈变量的内 ...

大部分明白了。就是因为栈释了吧。非常感谢你的解答。但还有一点不明白:为什么第一个能够正确的打印呢?

超级忍者龟 发表于 2014-3-5 21:49:21

隨鈊乄鎍慾 发表于 2014-3-5 21:00 static/image/common/back.gif
大部分明白了。就是因为栈释了吧。非常感谢你的解答。但还有一点不明白:为什么第一个能够正确的打印呢?

你的栈内存若是没有被系统使用,里面的数据暂时还是你要的,只是这些数据已经是垃圾数据了,系统随时会使用,如果系统还没使用,里面的数据当然你可以访问得到!

隨鈊乄鎍慾 发表于 2014-3-5 22:50:36

超级忍者龟 发表于 2014-3-5 21:49 static/image/common/back.gif
你的栈内存若是没有被系统使用,里面的数据暂时还是你要的,只是这些数据已经是垃圾数据了,系统随时会使 ...

哦,原来如此!

向往青莲 发表于 2014-3-5 22:51:53

亲。。。你都学了这么久了。。还这水平。。。→_→。。。我都不想吐槽了。。。你不是要写WG嘛。。我记得你以前给我说过
页: [1]
查看完整版本: 求高手帮忙解释一下为什么不一样?!