指针指针的麻烦

时间:2015-11-30 19:04:12

标签: c pointers

我正在学习指针,看起来我无法正确处理它们 所以我有一个字符串数组,我代表这样:

char** array;

我可以用这个函数打印数组的所有字符串,它工作正常:

void write_lines(char** array_of_string)
{
    for(; *array_of_string; array_of_string++)
        printf("%s", *array_of_string);
}

但我现在要做的是更改数组的内容,为此我想使用一个以char***为参数的函数:

void write_lines_2(char*** array_of_string)
{
    for(; ***array_of_string; (*array_of_string)++)
       printf("%s", **array_of_string);
}

这个功能只是一个测试,看如何使用char ***作为参数正确访问元素。正如你所期望的那样它可以编译但是在发射时会崩溃 你能解释一下如何做对吗?

编辑:最后,该函数将交换数组中的字符串 我已经有一个swap(char** string, char** string2)函数,这就是为什么我认为我需要第三个指针来改变作为参数传递的数组的内容而不仅仅是更改它的副本。

编辑2 :我尝试了更多的东西,我意识到了:

void write_lines(char*** array_of_string)
{
    int length = 3; // array goes from [0] to [3]

    for(i = 0; i <= length; i++) // It works!
        printf("%s", *(*array_of_string + i));

    for(i = 0; i <= length; i++, array_of_string++) // Crash
        printf("%s", **array_of_string);

    for(i = 0; i <= length; i++, array_of_string++); // Doesn't crash

    for(i = 0; i <= length; i++, (*array_of_string)++) // Crash
        printf("%s", **array_of_string);

    for(i = 0; i <= length; i++, (*array_of_string)++); // Crash
}

我想我应该使用(*array_of_string)++来改变指向哪个字符串,因为array_of_string++会改变指向哪个数组,但我不确定。无论如何,即使我可以用另一种方式构建函数,这只是一个练习,所以对我来说重要的是理解为什么我要做的事情不起作用,我仍然不知道为什么。

3 个答案:

答案 0 :(得分:4)

这有点奇怪

void write_lines(char** array_of_string)
{
    for(; **array_of_string; array_of_string++)
        printf("%s", *array_of_string);
}

它表示数组的末尾是一个空字符串。我想你真的想要

void write_lines(char** array_of_string)
{
    for(; *array_of_string; array_of_string++)
        printf("%s", *array_of_string);
}

它表示数组的末尾是空指针。这更为正常(一开始它允许数组中的空行)

答案 1 :(得分:1)

您的代码似乎终止于空字符 - 似乎您希望它在NULL字符串上终止。您需要进行以下更改:

void write_lines(char** array_of_string)
{
    // remove one dereference in the terminating condition of the loop
    for(; *array_of_string; array_of_string++)
        printf("%s", *array_of_string);
}

为了使其更具可读性,我可以通过传递数组的大小,而不是担心NULL终止数组来编写它:

#include <stdio.h>

#define SIZE 2

// Note that I'm passing the char** and the size.
void write_lines(char** arr, size_t n) {
  if(!arr) return;

  for(size_t i = 0; i < n; ++i) {
    printf("%s\n", arr[i]);
  }
}

int main() {
   char* strings[SIZE] = { "Hello", "World" };
   write_lines(strings, SIZE);

   return 0;
}

答案 2 :(得分:1)

首先,第一个函数应如下所示:

char ***pointer_to_array_of_strings

然后,您可以看到,当函数参数变为char **array_of_strings = *pointer_to_array_of_strings然后write_lines时。然后你可以像在(*pointer_to_array_of_string)++中一样行事。错误位于array_of_strings,因为它会sizeof(char **)移动pointer_to_array_of_strings

P.S。:array_of_stringschar ***在这里有些混乱。在这里,我使用前者表示char **,后者表示var ImageGallery = require('../../../app/components/image-gallery/image-gallery').default;