slu*_*p91 1 c pointers memory-management dynamic-arrays
嗨伙计们,我很抱歉打扰你,但我开始放松它了.我最近又开始用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 < eNb; i++)
{
val = val * v[i];
}
i=0;
while(val % 10 == 0)
{
i++;
}
return i; }
int main (int argc, char** argv) {
int* v = NULL;
int eNb = input(&(*v));
if(eNb>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;
}
Run Code Online (Sandbox Code Playgroud)
输入函数应该返回两个东西:元素的数量和动态数组中的实际元素.但是在输入函数运行后输入的值都丢失了..我将参数作为指针传递给输入,所以它应该改变正确地址的值对吗?
欢迎所有建议!日Thnx!
Ps我认为问题出在我的数组v ..退出输入函数后它会丢失所有值..
Ed *_* S. 11
C中的所有内容都按值传递,因此在执行赋值时:
v = (int*) realloc(v,n*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
您正在为变量的本地副本分配新值v.如果你想改变指针本身的价值(而不是修改什么的指针已经指向),您将需要一个指针传递给一个指针和反引用一次执行任务,也就是说,
int ModifyPointer( int **v )
{
// error checking and whatnot
*v = realloc(*v,n*sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)
这样想吧; 你有一个指针p驻留在内存地址0xA并指向内存地址0xFF.您传递p给函数并v创建副本.副本v位于存储器地址0x2A,但仍指向存储器地址0xFF.
p(0xA) v(0x2A)
| |
\ /
\ /
\ /
0xFF
Run Code Online (Sandbox Code Playgroud)
因此,当您取消引用任一指针时,您最终会引用相同的内存块,但指针本身位于内存中的不同位置.因此,当您修改副本的值时,它不会反映在原始文件中(即,realloc在新的内存位置创建一个新指针并将其分配给变量v,但p保持不变.)