求高手帮忙解释一下为什么不一样?!
如题:这样编写就能打印正确?请主要看红色部分:(小甲鱼的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;
}
首先你的程序写的有几处问题:
1:search函数double类型返回int型指针
2:search函数执行完毕,栈变量的内存引用会被释放,就是你main中获取到search的返回值,那也是不对的,释放的栈数据随时被系统征用
3:想得到函数返回而不会被释放,你可以返回score这个二维数组的地址
你先修改下代码,search可以再传递一个指针进去,获取不及格的成绩地址,返回值可以去掉,就没问题了!
search函数所占内存是分配的,调用完后就被回收了,所以你返回地址是没有意义的,应该用malloc或者static。至于第一种方法也是危险的(调试时有一个警告),不过可能是编译器原理问题,第一条printf的结果是对的。-------本人愚见,请多赐教。 第二个方法的第一个printf()方法多了一个%d 上面三楼说的是对的,你那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-4 23:29 static/image/common/back.gif
首先你的程序写的有几处问题:
1:search函数double类型返回int型指针
2:search函数执行完毕,栈变量的内 ...
大部分明白了。就是因为栈释了吧。非常感谢你的解答。但还有一点不明白:为什么第一个能够正确的打印呢? 隨鈊乄鎍慾 发表于 2014-3-5 21:00 static/image/common/back.gif
大部分明白了。就是因为栈释了吧。非常感谢你的解答。但还有一点不明白:为什么第一个能够正确的打印呢?
你的栈内存若是没有被系统使用,里面的数据暂时还是你要的,只是这些数据已经是垃圾数据了,系统随时会使用,如果系统还没使用,里面的数据当然你可以访问得到! 超级忍者龟 发表于 2014-3-5 21:49 static/image/common/back.gif
你的栈内存若是没有被系统使用,里面的数据暂时还是你要的,只是这些数据已经是垃圾数据了,系统随时会使 ...
哦,原来如此!
亲。。。你都学了这么久了。。还这水平。。。→_→。。。我都不想吐槽了。。。你不是要写WG嘛。。我记得你以前给我说过
页:
[1]