【问题标题】:How to loop through double pointers without knowing size. (C)如何在不知道大小的情况下循环双指针。 (C)
【发布时间】:2022-01-17 05:50:53
【问题描述】:

如何在不知道大小的情况下循环遍历这个双指针。

char *arr[] = {"ant", "bat", "cat", "dog", "egg", "fly"}; 
char **ptr = arr; // Double pointer 

我试过了,但我得到一个错误

while (*ptr){
   printf("%s\n",*ptr);
   ptr+=1;
}

我不想要类似的东西,但有双指针。

char *word = *ptr;
for (int i = 0; *(word + i) != '\0'; i++)
{
   printf("%c", *(word + i));
}

【问题讨论】:

  • 你得到什么错误?
  • 16711 分段错误:11 ./Main
  • 使用哨兵值?例如char *arr[] = {"ant", "bat", "cat", NULL};
  • 好吧,你可以使用 while (*ptr),但你的列表中没有零。尝试添加一个 NULL。
  • 带有for 循环。 for(size_t i=0; i < sizeof arr / sizeof arr[0]; i++)

标签: c pointers


【解决方案1】:

您可以使用\0 确定字符串的结尾的原因是,当您将一个指针分配给一个空字节时,会自动将一个空字节放在末尾,请注意字符串的定义是一个以空字符结尾的字符数组。您可以通过在末尾添加一个 NULL 元素来在字符串数组中模仿这种行为:

char *arr[] = {"ant", "bat", "cat", "dog", "egg", "fly", NULL};
char **ptr = arr;  // Double pointer

while (*ptr) {
    printf("%s\n", *ptr);
    ptr += 1;
}

这就是所谓的哨兵。

【讨论】:

  • 无论数组ints等的类型如何,这项工作都可以吗..
  • 对于其他数据类型,只有在哨兵值不能是数据值时才有效。例如,使用INT_MIN 作为标记,当该值从未出现在数据本身中时。它在这里工作,因为NULL 永远不能是字符串的地址。
  • 提示:您可以使用NAN 作为浮点数数组的标记值。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2023-03-05
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
相关资源
最近更新 更多