首页 > 代码库 > 关于printf造成指针*p乱码的问题
关于printf造成指针*p乱码的问题
关于printf()影响指针*p结果的有关讨论,现摘取一篇网文。
int main() { int stu[M][N] = {NULL}; float* arr; float* MeanStuFun(int p[M][N]); int i,j; for(i=0;i<M;i++) { printf("please input the scores of NO.%d\n",i+1); for(j=0;j<N;j++) scanf("%d",&stu[i][j]); } arr=MeanStuFun(stu);
printf("\nevery student‘s mean score is:\n"); for(i=0;i<M;i++) printf("%8.2f",*(arr+i)); return 0; } float* MeanStuFun(int p[M][N]) { int i,j; float arr[M]={NULL}; float mean=0; for(i=0;i<M;i++) { for(j=0;j<N;j++) mean=mean+p[i][j]; arr[i]=1.0*mean/N; mean=0; } return arr; }
上面第一个printf()可以输出标题,但第二个printf()输出的值为乱码。如果将第一个printf()移到arr=MeanStuFun(stu)前,则这种问题就得到解决。
这是什么原因呢? 调用函数printf前先要将形参压栈,这时候要计算*arr。所以,第一条printf语句已经把参数算出来并放到栈顶保存了。然后调用printf函数(函数调用需要用到栈建立访问连和控制链,而原来的函数function执行完了,原本f是在栈顶的,所以,函数f的栈空间释放。数组空间也被释放),printf占用了栈,所以,把原来函数f的栈空间内容修改了。所以,第一条printf语句是可以得到结果的。后面因为arr空间的内容已经被修改,所以,之后的printf语句都得不到结果。
顺便再解释一下printf("%s\n",*arr);得到的为什么是乱码。
正如上面所说,先计算参数*arr的值保存栈顶。保存的值为arr的地址。然后调用printf函数,把栈顶空间内容修改了。虽然保存了地址,但是原来的内容已经修改了,所以得不到结果。
关于printf造成指针*p乱码的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。