Как исправить ошибку печати о указателе массива в C (ошибка сегментации)? - PullRequest
0 голосов
/ 03 апреля 2019

Я только начал изучать указатели на C. Я нашел что-то особенное и получил ошибку об этом коде. Можете ли вы помочь мне выяснить, почему ошибка "Ошибка сегментации" № 9 вызывает

#include<stdio.h>

int main() {
    int a[] = {10, 20, 30, 40, 50};
    int *p[] = {a, a+1, a+2, a+3, a+4};
    int **pp = p;
    int ***ppp = &pp;

    printf("\n === Part1 === \n\n");
    printf(" 0. %p\n", a);
    printf(" 1. %p\n", *p);
    printf(" 2. %p\n", *pp);
    printf(" 3. %p\n", **ppp);

    printf("\n === Part2 === \n\n");
    printf(" 4. %d\n", *p[0]);
    printf(" 5. %d\n", *pp[0]);
    printf(" 6. %d\n", **ppp[0]);

    printf("\n === Part3 === \n\n");
    printf(" 7. %d\n", *p[3]);
    printf(" 8. %d\n", *pp[3]);
    printf(" 9. %d\n", **ppp[3]);

    printf("\n");

    return 0;
}

Ответы [ 2 ]

4 голосов
/ 03 апреля 2019

Это связано с приоритетом оператора.[] связывается более плотно, чем *, поэтому **ppp[3] означает **(ppp[3]), что не будет делать то, что вы хотите.

Я думаю, что вы хотите (**ppp)[3].

1 голос
/ 03 апреля 2019

Другие люди дали вам понять, что пошло не так, вот как это выяснить в следующий раз:

$ gcc -Wall -Werror -std=gnu11 -Wextra -g -O0 -o program program.c
$ gdb ./program
(gdb) run
Program received signal SIGSEGV, Segmentation fault.
main () at program:23
23          printf(" 9. %d\n", **ppp[3]);
(gdb) p ppp[3]
$1 = (int **) 0x7fffffffe2d8
(gdb) p **ppp[3]
Cannot access memory at address 0x280000001e

Это показывает, что попытка разыменования *ppp[3] является причиной вашего segfault. Оттуда, немного подумав и поиграв с этим, вы должны понять, что пошло не так. Оттуда до попытки p (**ppp)[3] и проверки того, что она печатает ожидаемый результат, не должно быть слишком большого шага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...