#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
int main(){
float *pf;
int i,n;
scanf("%d",&n);
pf=(float*) malloc(n*sizeof(float));
for(i =0;i<n;i++){
*(pf++)=(float)(i+1); //为什么输出使用*(pf++)这样的操作没有问题,但是输入使用这样的操作*(pf++)就会有问题 ,使用 *(pf+i)本来是正确的,按道理 *(pf++)也应该是正确的呀
}
for(i=0;i<n;i++){
printf("%f\t",*(pf++)); //为什么输出可以使用这样的操作,但是输入使用这样的操作就会出现错误的运行结果
}
}
正如上面所讲,第十行的使用了下面的代码块,才导致出现问题的
*(pf++)=(float)(i+1);
原因分析:pf++和pf+i的性质不一样,前者当存储空间的值有数据之后,就是第一个for循环结束之后,pf++不会自动回到pf,所以第二次for循环无论当使用pf++还是pf+i都是在第一次for循环pf++的基础上循环打印已经保存在存储空间的数据,可是这个时候已经超出了pf指针的申请空间了,所以自然就会打印出无效值 或者没有意义的值。但若使用pf+i,这个时候整个存储空间无论是在第一个还是第二个for循环中基地址都是pf,所以才是正确的!所以有两种方法解决前者的错误:一是在第一个for循环中使用pf+i,而第二个for循环中随便使用pf++或者pf+i都行;二是在第一个for循环中依然使用pf++,但是在第二个for循环之前想办法让指针回溯到基地址pf,若不回溯,定会出现打印结果异常等情况,但是对于指针回溯到基地址别人目前没有找到好的解决方法!
结合图片分析错误如下