1

ポインタの配列をポインタに割り当ててからアクセスしようとすると、次のようになります。

void tester(char ***p)
{
    int i;
    char **pp;

    pp = *p;
    pp = calloc(10, sizeof(*pp));

    for (i = 0; i < 10; i++)
        printf("%d = %p\n", i, pp[i]);

            *p = pp;
}

void tester_broken(char ***p)
{
    int i;

    *p = calloc(10, sizeof(**p));

    for (i = 0; i < 10; i++)
        printf("%d = %p\n", i, *p[i]);
}

int main(void)
{ 
    char **a;

    tester(&a);
    tester_broken(&a);

    return 0;
}

これらの機能の1つと他のセグメンテーション違反の理由を誰かが説明できますか?

4

1 に答える 1

6

これは優先順位の問題です。試す:

void tester_fixed(char ***p)
{
    int i;

    *p = calloc(10, sizeof(**p));

    for (i = 0; i < 10; i++)
        printf("%d = %p\n", i, (*p)[i]);
}

角かっこ演算子(配列の添え字)は、アスタリスク演算子(逆参照)よりも厳密にバインドされます。括弧はあなたの意図を明確にします。

于 2011-07-25T20:42:10.143 に答える