C程序,指针参数不会保存值

嗨伙计们,我很抱歉打扰你,但我开始在这里松开它..我最近再次开始用C编程,我遇到了一些我无法弄清楚的错误..我的C程序是(应该)是一个简单的程序,因此它需要执行以下操作:从键盘读取未定义数量的自然元素,直到读取0。 之后,它必须计算所有元素的乘积,并在该结果的末尾计算0-s的数量。

int input(int* v) { int n = 0; do { n = n + 1; v = (int*) realloc(v,n*sizeof(int)); printf("Enter number %d: ",n); scanf("%d",&v[n-1]); } while(v[n-1] != 0); n--; return n; } int tZeros(int* v, int eNb) { int i; int val = 1; for(i = 0; i 0) { int zeros = tZeros(v, eNb); printf("The number of ending zeros in the product of the given numbers is: %d",zeros); } else { printf("No elements to do computations with!\n"); } free(v); return 0; } 

输入函数应返回两件事:动态数组中元素的数量和实际元素。但是输入函数运行后输入的值都丢失了..我将参数作为指针传递给输入,所以它应该改变正确地址的值对吗?

欢迎所有建议! 日Thnx!

Ps我认为问题出在我的数组v ..退出输入函数后它会丢失所有值..

C中的所有内容都按值传递,因此在执行赋值时:

 v = (int*) realloc(v,n*sizeof(int)); 

您正在为变量v 的本地副本分配新值。 如果要更改指针本身的值(而不是修改指针指向的内容),则需要将指针传递给指针并取消引用一次以执行赋值,即

 int ModifyPointer( int **v ) { // error checking and whatnot *v = realloc(*v,n*sizeof(int)); } 

这样想吧; 你有一个指针p驻留在内存地址0xA并指向内存地址0xFF。 将p传递给函数并创建副本v 。 副本v位于存储器地址0x2A,但仍指向存储器地址0xFF。

  p(0xA) v(0x2A) | | \ / \ / \ / 0xFF 

因此,当您取消引用任一指针时,您最终会引用相同的内存块, 但指针本身位于内存中的不同位置 。 因此,当您修改副本的值时,它不会反映在原始文件中(即,realloc在新的内存位置创建一个新指针并将其分配给变量v ,但p保持不变。)