【问题标题】:C program, pointer argument won't hold valuesC程序,指针参数不会保存值
【发布时间】:2011-07-11 13:03:12
【问题描述】:

大家好,很抱歉打扰你们,但我开始在这里松懈了.. 我最近又开始用 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; 
    }

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

欢迎所有建议! 谢谢!

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

【问题讨论】:

  • SO 的 markdown 解析器有什么问题?
  • 没有时间检查所有内容,但.. i=0; while(val % 10 == 0) { i++; } 这将永远循环,而不是循环。
  • @Radek S:你指的是什么?
  • @Ed 一些代码没有突出显示并且字体错误。至少在我的 iPod touch 上。
  • 对不起代码..可能是因为我只是复制粘贴它..

标签: c pointers memory-management dynamic-arrays


【解决方案1】:

C 中的一切都是按值传递的,所以当你执行赋值时:

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

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

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 保持不变。)

【讨论】:

  • 我见过指针、指针指针甚至指针指针,但这个答案太棒了。 :)
  • realloc(v,... -> realloc(*v,... ... 在 C 中,强制转换是不必要的。
  • @Jim Balter:谢谢,我只是不假思索地复制了它。固定。
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 2016-06-02
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多