3

当我想通过函数初始化指向数组的指针时,我正在执行以下操作:

通过函数初始化和销毁​​数组:

int initArr(int **b)
{
    int *arr = (int *) malloc(sizeof(int)*2);

    if(arr == NULL)
        return 0;

    *b = arr;
    arr = NULL;
    return 1;
}

void destroyArr(int *b)
{
    free(b); 
    b = NULL;
}

初始化指向数组的指针:

int *pArr;
int initStatus = initArr(&pArr);

if(initStatus == 0)
{
    printf("%s", "error");
    return 0;
}

使用指向数组的指针:

*pArr = 1;
*(pArr + 1) = 2;

printf("0 = %i\n", *pArr);
printf("1 = %i\n", *(pArr + 1));

销毁指向数组的指针:

destroyArr(pArr);
pArr = NULL;

这是正确和安全的吗?

4

4 回答 4

4

我没有测试它,但它似乎是正确的。不过,一个小评论:您不需要设置arrbto NULL,它们处于其范围的最后,无论如何都不能(安全地)访问。

于 2012-06-03T13:57:31.847 回答
3

initArr 函数可以简化为:

int initArr(int **b)
{
    *b = malloc(2 * sizeof **b);

    return *b ? 1 : 0;
}
于 2012-06-03T14:22:12.123 回答
2

事实上,initArr 和 destroyArr 根本没有增加任何值。它们包装标准 C 函数以返回并执行完全相同的操作。

此外,您可以使用数组索引器 [] 来访问已分配数组的各个成员。

这是一个等效的工作:

int* pArr = (int*) malloc(2 * sizeof(int));
if (pArr) {
    pArr[0] = 1;
    pArr[1] = 2;
    printf("0 = %d\n", pArr[0]);
    printf("1 = %d\n", pArr[1]);
    free(pArr);
}
于 2012-06-03T14:13:13.153 回答
-1

看起来不错,但freeindestroyArr()并没有给你任何东西,因为你没有将双指针传递给它。

于 2012-06-03T13:51:18.017 回答