用c语言打印动态数组

用c语言打印动态数组,c,C,我尝试从我的用户那里获取数字,这是我的功能 我的函数获取arr作为指针,并将其设置为一个新数组,然后返回要打印的数字的计数器 但是当我试图打印数组时,我得到了一个错误,而这个错误没有被注意到 int GetNumber(int *arr) { int n,i=0; int *temp; temp = (int*)calloc(1,sizeof(int)); assert(temp); scanf("%d",&n); while(n != -

我尝试从我的用户那里获取数字,这是我的功能

我的函数获取arr作为指针,并将其设置为一个新数组,然后返回要打印的数字的计数器

但是当我试图打印数组时,我得到了一个错误,而这个错误没有被注意到

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;
}

问题是您修改了一个局部变量

在C语言中,所有参数都是“按值”传递的,这意味着值被复制到函数的作用域中。指针
arr
也会发生这种情况。如果在函数中修改
arr
,这将永远不会影响调用者

解决方案是传递一个指向您要修改的内容的指针,因此您的签名应该如下所示:

int GetNumber(int **arr)
尽管如此,该指针还是按值传递,但它指向要修改的另一个指针


另一方面,不要在C中强制转换
void*
。它可以隐式转换为任何指针类型。

问题在于修改了局部变量

在C语言中,所有参数都是“按值”传递的,这意味着值被复制到函数的作用域中。指针
arr
也会发生这种情况。如果在函数中修改
arr
,这将永远不会影响调用者

解决方案是传递一个指向您要修改的内容的指针,因此您的签名应该如下所示:

int GetNumber(int **arr)
尽管如此,该指针还是按值传递,但它指向要修改的另一个指针


另一方面,不要在C中强制转换
void*
。它可以隐式转换为任何指针类型。

您只是在当前堆栈帧上修改指针的地址,而不是在调用堆栈帧上修改指针的地址。您应该使用
int**arr
作为参数,realloc使用
*arr=realloc(*arr,…)
,从而传递指向int指针的指针,如下所示:
GetNumber(&u arr)
不要
realloc
,并将返回值分配给原始变量。如果
realloc
失败,则原始
temp
不会被释放,并且
NULL
会被返回并分配给
temp
,导致您丢失对
temp
所指向内存块的引用,从而导致内存泄漏。而是使用临时指针,例如
void*t=realloc(temp,i*sizeof*temp);如果(t)温度=t只修改当前堆栈帧上指针的地址,而不修改调用堆栈帧上指针的地址。您应该使用
int**arr
作为参数,realloc使用
*arr=realloc(*arr,…)
,从而传递指向int指针的指针,如下所示:
GetNumber(&u arr)
不要
realloc
,并将返回值分配给原始变量。如果
realloc
失败,则原始
temp
不会被释放,并且
NULL
会被返回并分配给
temp
,导致您丢失对
temp
所指向内存块的引用,从而导致内存泄漏。而是使用临时指针,例如
void*t=realloc(temp,i*sizeof*temp);如果(t)温度=t这里是一个方便的链接,用于
malloc
演员阵容(你会发现你需要它一次又一次),这里是一个方便的链接,用于
malloc
演员阵容(你会发现你需要它一次又一次),