在函数中初始化数组

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

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

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; 

这是正确和安全的吗?

我没有测试过,但看起来是正确的。 但是一个小的评论:你不需要将arrb设置为NULL ,它们就在它们的范围的最后,并且无论如何都不能(安全地)访问它。

initArr函数可以简化为:

 int initArr(int **b) { *b = malloc(2 * sizeof **b); return *b ? 1 : 0; } 

实际上,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); } 

看起来很好但是destroyArr()中的free是不会给你任何东西的,因为你没有传递一个双指针。