This question already has an answer here:
Closed 3 years ago.
Dynamic memory access only works inside function
(1个答案)
我想写一个函数来改变动态数组的大小,并允许用户立即填充它。我知道我应该用“realloc”来实现它(我做到了,所以它有效……),但是我的第一次尝试看起来是这样的:
void ChangeDynamicArraySize(int* dArray, int oldSize, int newSize){

    int* tempArray = (int*) malloc(sizeof(int) * oldSize);
    CopyArray(tempArray, dArray, oldSize);
    free(dArray);
    dArray = (int*) malloc(sizeof(int) * newSize);
    CopyArray(dArray, tempArray, oldSize);

    for (int i = oldSize; i < newSize; i++){
        scanf("%i", &dArray[i]);
    }
    PrintArray(dArray, newSize);
    free(tempArray);
}

函数体“PrintArray(dArray,newSize);”工作正常。
但是当从main()调用时,它会给出如下结果:
-17891602号
-17891602号
-17891602号
-17891602号
看来dArray被释放了。。。?但是我知道分配的内存在退出函数后不会自动释放。
那是什么原因呢?

最佳答案

在C语言中,函数参数是本地复制的。对值dArray所做的任何更改都指向(*dArray)可以工作,但对作为参数传递的dArray地址所做的任何更改都只是此函数的本地更改,因为它是一个副本。
您可能需要传递数组的地址(main中的a&array,函数原型中的adArray**)并更改指针。
像这样的:

void ChangeDynamicArraySize(int** dArray, int oldSize, int newSize){

    int* tempArray = (int*) malloc(sizeof(int) * oldSize);
    CopyArray(tempArray, *dArray, oldSize);
    free(*dArray);
    *dArray = (int*) malloc(sizeof(int) * newSize);
    CopyArray(*dArray, tempArray, oldSize);

    for (int i = oldSize; i < newSize; i++){
        scanf("%i", dArray[i]);
    }
    PrintArray(*dArray, newSize);
    free(tempArray);
}

或者,您也可以只返回新的malloced数组的地址(使您的函数返回这个int*而不是没有值)。
此外,对于良好实践,您可能需要not cast the return of malloc,并检查它是否失败和changed ERRNO(如果您使用POSIX API)。

关于c - C使用malloc和memcpy动态更改数组的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39832502/

10-11 21:46