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

私はそれをテストしていませんが、それは正しいようです。arrただし、マイナーなコメント:設定または設定bする必要はありません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

見た目は良さそうですが、ダブルポインタを渡していないため、 freeinは何も提供しません。destroyArr()

于 2012-06-03T13:51:18.017 に答える