Указатели на указатели и указательные массивы
gcc 4.4.4 c89
Я понимаю, что указатели в порядке. Однако я перехожу к указательным массивам и указателям на указатели.
Я общался с этим фрагментом кода и оставил комментарии к тому, что, как я думаю, понял.
Большое спасибо за любой совет, если мои комментарии верны с линией кода?
void increment_ptr()
{
/* Static char array */
char src[] = "rabbit";
/* pointer to array of pointers to char - 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++);
}
}
Ответы
Ответ 1
Комментарии ниже каждой части (бит, которые я не упомянул, верны):
/* Static char array */
char src[] = "rabbit";
Этот массив не является статическим - он имеет время хранения auto
.
/* pointer to array of pointers to char - create 6 pointers in this array */
char *dest[sizeof(src)];
Это массив указателей на char, а не указатель на массив. Длина массива равна 7, поскольку sizeof(src)
равно 7 (он включает в себя нулевой ограничитель строк).
/* 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 };
... и он будет работать.
Ответ 2
Я бы посоветовал вам прочитать Раздел 6 онлайн-C-FAQ: 6. Массивы и указатели
Ответ 3
Ошибка при назначении dest ptr_ptr, что на самом деле является неинициализированным массивом указателей на символы, проходя через него, когда цикл while будет терпеть неудачу.
/* 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++);
}