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 指向数组第一个元素的指针。任何人只要有这样一个指针就可以访问整个数组。
所以这是一个简单的两步计划。
- 有一个数组。
- 有一个指向其第一个元素的指针。
唯一的问题如下。如果你 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 指向动态分配数组的第一个元素的指针,使调用者可以使用数组。在您的情况下,数组的每个元素 也是 指向动态分配数组的第一个元素的指针。
调用者处理完数组后,他们应该释放数组占用的内存。在您的情况下,还释放了每个单独的字符串占用的内存——在释放主数组之前!
我是 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 指向数组第一个元素的指针。任何人只要有这样一个指针就可以访问整个数组。
所以这是一个简单的两步计划。
- 有一个数组。
- 有一个指向其第一个元素的指针。
唯一的问题如下。如果你 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 指向动态分配数组的第一个元素的指针,使调用者可以使用数组。在您的情况下,数组的每个元素 也是 指向动态分配数组的第一个元素的指针。
调用者处理完数组后,他们应该释放数组占用的内存。在您的情况下,还释放了每个单独的字符串占用的内存——在释放主数组之前!