0

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

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];

然后返回这个:

char** final = list;
return final;

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

main.c:66:20:警告:从不兼容的指针类型初始化 [-Wincompatible-pointer-types]

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

是源代码。如果需要,请检查它。

请帮我。

4

2 回答 2

2

您不能从 C 中的函数返回数组。

这不是一个大问题,因为您总是可以返回指向数组第一个元素的指针。任何拥有这样一个指针的人都可以访问整个数组。

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

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

唯一的问题如下。如果你从一个函数返回一个指向某个东西的指针,那么当函数返回时,那个东西最好是活着的。您不希望指向漂浮的死物的指针。但是,函数中声明的普通变量(包括数组)会在函数返回时消失。所以你需要别的东西。

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

克服这个问题的另一种方法是使用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);

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

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

于 2020-05-09T20:00:23.253 回答
1

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

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

这样做仍然允许您通过 using 引用特定的单词/句子,list[i]并且您可以返回listchar **

char **result = list;
return result;
于 2020-05-09T19:36:21.973 回答