указатели на указатели и массивы указателей - PullRequest
2 голосов
/ 11 августа 2010

gcc 4.4.4 c89

Я понимаю, что указатели в порядке. Однако я подхожу к массивам указателей и указателям на указатели.

Я возился с этим фрагментом кода и оставил комментарии о том, что я понимаю.

Большое спасибо за любые советы, если мои комментарии верны со строкой кода?

void increment_ptr()
{
    /* Static char array */
    char src[] = "rabbit";
    /* pointer to array of pointers to char's - create 6 pointers in this array */
    char *dest[sizeof(src)];
    size_t i = 0;

    /* pointer to a char */
    char* chr_ptr = NULL;
    /* pointer to pointer that points to a char */
    char** ptr_ptr = NULL;

    /* chr_ptr pointer now points to the memory location where 'rabbit' is stored. */
    chr_ptr = src;
    /* ptr_ptr points to the first memory address of the pointer array of where dest is stored */
    ptr_ptr = dest;

    /* Deference chr_ptr and keep going until nul is reached 'rabbit\0'  */
    while(*chr_ptr != '\0')
        /* deference ptr_ptr and assign the address of each letter to the momory location where
           ptr_ptr is currently pointing to. */
        *ptr_ptr++ = chr_ptr++;

    /* reset the ptr_ptr to point to the first memory location 'rabbit' */
    ptr_ptr = dest;

    /* Keep going until NULL is found - However, my program never finds it, ends in UB */
    while(ptr_ptr != NULL) {
        /* Dereference what the pointer to pointer is pointing at the memory lcoation */
        printf("[ %s ]\n", *ptr_ptr++);
    }
}

Ответы [ 3 ]

7 голосов
/ 11 августа 2010

Комментарии под каждой частью (правильные биты):

/* Static char array */
char src[] = "rabbit";

Этот массив не является статическим - он имеет auto длительность хранения.

/* pointer to array of pointers to char's - create 6 pointers in this array */
char *dest[sizeof(src)];

Это массив указателей на символ, а не указатель на массив. Длина массива равна 7, потому что sizeof(src) равно 7 (он включает терминатор строки nul).

/* chr_ptr pointer now points to the memory location where 'rabbit' is stored. */
chr_ptr = src;

Точнее, он указывает на первый символ в src, который является 'r' в "rabbit".

/* ptr_ptr points to the first memory address of the pointer array of where dest is stored */
ptr_ptr = dest;

Он указывает на первый указатель в массиве dest.

/* Keep going until NULL is found - However, my program never finds it, ends in UB */
while(ptr_ptr != NULL) {

Правильно - потому что вы никогда не инициализировали dest. Вы можете изменить объявление dest на следующее:

char *dest[sizeof(src)] = { 0 };

... и это будет работать.

4 голосов
/ 11 августа 2010

Я бы посоветовал вам прочитать Раздел 6 онлайн-C-FAQ: 6. Массивы и указатели

1 голос
/ 11 августа 2010

Ошибка возникает, когда вы присваиваете dest для ptr_ptr , который на самом деле является неинициализированным массивом указателей на символы, проходя через него в цикле while.1006 *

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