C 指向指针和指针数组的指针

C 指向指针和指针数组的指针,c,pointers,C,Pointers,通用条款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 ar

通用条款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++);
    }
}
每个部分下面的注释(我没有提到的部分是正确的):

此阵列不是静态的-它具有
auto
存储持续时间

/* pointer to array of pointers to char's - create 6 pointers in this array */
char *dest[sizeof(src)];
这是指向char的指针数组,而不是指向数组的指针。数组的长度是7,因为
sizeof(src)
是7(它包括nul字符串终止符)

更准确地说,它指向
src
中的第一个字符,即
“rabbit”
中的
'r'

它指向
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 };

…它会工作。

错误是当您将dest分配给ptr\u 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++);
}

我建议您阅读在线C-FAQ的第6节:

他在上一个循环中设置了
dest
的前6个成员的值(尽管第七个成员尚未初始化)。您是对的,我错过了这一部分。但他确实还是跳过了“\0”
/* Keep going until NULL is found - However, my program never finds it, ends in UB */
while(ptr_ptr != NULL) {
char *dest[sizeof(src)] = { 0 };
/* 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++);
}