2017-05-27 57 views
0

我试图从我的用户得到的数字,这是我的职责,打印动态数组

我的功能得到改编为指针,将其设置为一个新的数组并返回,我得到的数量的计数器打印。

,但是当我尝试打印数组我得到一个错误疗法被提

int GetNumber(int *arr) 
{ 
    int n,i=0; 
    int *temp; 
    temp = (int*)calloc(1,sizeof(int)); 
    assert(temp); 
    scanf("%d",&n); 
    while(n != -1) 
    { 
     i++; 
     temp = (int*) realloc(temp,i*sizeof(int)); 
     assert(temp); 
     temp[i-1] = n; 
     scanf("%d",&n); 
    } 
    arr = temp; 
    return i; 
} 
+1

您只修改当前堆栈帧上的指针地址,而不是调用的地址。你应该使用'int ** arr'作为参数并且使用'* arr = realloc(* arr,...)'来重新分配,并且因此将一个指针传递给一个int指针,如下所示:'GetNumber(&the_arr)' – Cheatah

+0

而不是'realloc'并将返回值分配给您的原始变量。如果'realloc'失败,原始的'temp'不会被释放,并且'NULL'被返回并分配给'temp',导致您失去对'temp'所指向的内存块的引用,从而产生内存泄漏。而是使用临时指针,例如'void * t = realloc(temp,i * sizeof * temp);如果(t)temp = t;' –

回答

2

的问题是,您修改局部变量。

在C中,所有参数都是“按值”传递的,这意味着该值被复制到函数的作用域中。这也会发生在您的指针arr。如果您在该功能中修改arr,这绝不会影响呼叫者。

的解决方案是将指针传递给要修改什么,所以你的签名应该是这样的:

int GetNumber(int **arr) 

的是,这个指针是按值传递,但它指向你想要的其他指针修改。

请注意,不要在C中转换void *。它可以隐式转换为任何指针类型。

+0

这里有一个'malloc'类型的方便链接(你会发现你需要重复它),[**我是否将malloc的结果? (http://stackoverflow.com/q/605845/995714) –