Ошибка SEG при использовании множества уровней косвенности

StackOverflow https://stackoverflow.com/questions/6822055

  •  26-10-2019
  •  | 
  •  

Вопрос

При распределении, а затем попытка получить доступ к ряду указателей к указателям:

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;
}

Может ли кто -нибудь объяснить, почему одна из этих работ и другие недостатки SEG?

Это было полезно?

Решение

Это проблема приоритета. Пытаться:

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]);
}

Оператор кронштейна (абонент массива) крепче связывается, чем оператор Asterisk (Dereference). Священники заставляют ваше намерение объяснить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top