C语言函数传入参数为什么会出现原本的数值和传入后的数值不一样这样的错误,明明应该没有溢出?

#include <stdio.h>#include <math.h>#include <malloc.h>#define MAX_SIZE 100float** Runge_Kutta_2(void(*func), float t, float h, float init);float func_test(float t, float y){ float a = (float)(exp(-y)); float b = (float)(t * t); printf("%f %f %f\n",a,b,t); return (a-b);}int main() { float** p; p = Runge_Kutta_2(func_test, 10.0f, 0.001f, 0.0f);}float** Runge_Kutta_2(float(*func)(), float t, float h, float init){ float* Y, *T; float* P[2]; float K1 = 0, K2 = 0, K = 0, time = 0; int k=0,num=1; Y = (float*)malloc(MAX_SIZE * sizeof(float)); T = (float*)malloc(MAX_SIZE * sizeof(float)); Y[0] = init, T[0] = 0; while (time <= t - h) { K1 = func(time, Y[k]); K2 = func(time + h, Y[k] + h * K1); printf("%f\n", time + h); time += h; //printf("%f %f\n", Y[k], T[k]); (*(Y+k+1)) = (*(Y+k)) + h / 2 * (K1 + K2); (*(T + k + 1)) = time; k++; if (k == MAX_SIZE * num - 1) { num++; Y = realloc(Y, num * MAX_SIZE); T = realloc(T, num * MAX_SIZE); } } P[0] = Y,P[1] = T; return P;}

1 所有的参数传递,都是传递值的拷贝。(如果想知道为什么,去学习编译原理的函数调用的参数压栈和出栈对应内容)。
2 C传指针进去,其实也是把这个指针值按拷贝传送进去。但是因为指针值指向一块外部内存空间(其实更多是堆空间,或外层栈变量空间),所以感觉可以在函数里改变外部变量。其实本质还是按拷贝传递,只是传递进去的是一个访问变量的渠道。
因此,如果我们希望函数内能改变外部的指针值,往往传进去的是指针变量的指针。呵呵,很多初学C的程序员,对**非常难理解。
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答