C中returns字符串数组的函数

Function that returns array of strings in C

我是 C 的新手,我目前正在做一个项目,我需要从 Json 文件(使用 json-c library)中读取列表。因此,我创建了一个 returns 字符串数组(列表)的函数。我搜索了一下,发现函数中的 return 字符串数组需要键入如下内容:

char** readJson(...) {
    ...
}

主要是:

int main() {
    ...
    char** list = readJson();
    ...
}

我的问题是,当我创建我的数组时,在读取函数中,我没有声明它,而是循环遍历列表项(来自 json 对象)并将它们添加到列表。例如,我不:

char** list = {"...", "..."}

我愿意:

char** list;
for (int i = 0; i < LIST_SIZE; i++) {
    strcpy(list[i], json_object_get_string(json_obj));
}

当我尝试在 strcpy 之后(在 for 循环中)打印列表项时,它关闭了程序。 所以,我尝试创建这样的数组:

char list[LIST_SIZE][MAX_CHAR];

然后 return 这个:

char** final = list;
return final;

它奏效了。 但是,当我return编辑列表时,它在编译器中给我一个警告:

main.c:66:20: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]

当我尝试在 main 中打印列表时它崩溃了。

Here是源代码。想看就看

请帮帮我。

如评论中所述,您不能简单地交换数组和指针。根据您的用例,我建议使用 malloc() 动态分配您的 list 变量。大致如下:

char **list = malloc(LIST_SIZE * sizeof(char *));
for(int i = 0; i < LIST_SIZE; i++)
    list[i] = malloc(MAX_CHAR * sizeof(char));

这样做仍然允许您使用 list[i] 引用特定的 words/sentences,并且您可以 return list 作为 char **:

char **result = list;
return result;

您不能 return 来自 C 函数的数组。

这不是什么大问题,因为您总是可以 return 指向数组第一个元素的指针。任何人只要有这样一个指针就可以访问整个数组。

所以这是一个简单的两步计划。

  1. 有一个数组。
  2. 有一个指向其第一个元素的指针。

唯一的问题如下。如果你 return 从一个函数中指向某物的指针,那么当函数 return 时,那个东西最好是活着的。您不希望指向四处漂浮的死东西的指针。然而,在函数中声明的普通变量,包括数组,在函数 returns 时消亡。所以你需要别的东西。

克服这个问题的一种方法是使数组成为静态变量或全局变量,而不是函数中的普通(自动)变量。这具有有限的用途。您的数组必须具有固定大小,当然所有对您函数的调用每次都会 return 相同。

克服这个问题的另一种方法是使用 malloc 系列函数动态分配数组。

char* list = malloc(sizeof(char*) * number_of_elements_in_list);

list 现在指向 char*.

动态分配数组的第一个元素

注意元素也是指针,需要正确初始化。如何?只需再次阅读此答案并将其应用于每个单独的字符串。例如

for (int i = 0; i < number_of_elements_in_list; ++i)
    list[i] = read_next_json_string(json_object);

因此,您通过 return 指向动态分配数组的第一个元素的指针,使调用者可以使用数组。在您的情况下,数组的每个元素 也是 指向动态分配数组的第一个元素的指针。

调用者处理完数组后,他们应该释放数组占用的内存。在您的情况下,还释放了每个单独的字符串占用的内存——在释放主数组之前!