当我想通过函数初始化指向数组的指针时,我正在执行以下操作:
通过函数初始化和销毁数组:
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;
这是正确和安全的吗?
答案 0 :(得分:4)
我没有测试过,但看起来是正确的。但是,一个小评论:您不需要将arr
或b
设置为NULL
,它们位于其范围的最后,无法(安全地)访问之后,无论如何。
答案 1 :(得分:3)
initArr函数可以简化为:
int initArr(int **b)
{
*b = malloc(2 * sizeof **b);
return *b ? 1 : 0;
}
答案 2 :(得分: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);
}
答案 3 :(得分:-1)
看起来不错,但free
中的destroyArr()
没有给你任何东西,因为你没有传递双指针。