簡體   English   中英

Function 返回 C 中的字符串數組

[英]Function that returns array of strings in C

我是 C 的新手,我目前正在做一個項目,我需要從 Json 文件中讀取列表(使用json-c library )。 因此,我創建了一個返回字符串數組(列表)的 function。 我進行了搜索,發現要在 function 中返回字符串數組,您需要輸入以下內容:

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

主要是:

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

我的問題是,當我創建數組時,在讀取的 function 中,我沒有聲明它,我循環遍歷列表項(來自 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 中打印列表時,它會崩潰。

是源代碼。 如果需要,請檢查它。

請幫我。

您不能從 C 中的 function 返回數組。

這不是一個大問題,因為您總是可以返回指向數組第一個元素的指針。 任何擁有這樣一個指針的人都可以訪問整個數組。

所以這里有一個簡單的兩步計划。

  1. 有一個數組。
  2. 有一個指向其第一個元素的指針。

唯一的問題如下。 如果你從 function 返回一個指向某個東西的指針,那么當 function 返回時,這個東西最好還活着。 您不希望指向漂浮的死物的指針。 但是,在 function 中聲明的正常變量(包括 arrays)會在 function 返回時消失。 所以你需要別的東西。

解決此問題的一種方法是創建數組 static 或全局變量,而不是 function 中的普通(自動)變量。 這用途有限。 您的數組必須是固定大小的,當然,對 function 的所有調用每次都會返回相同的內容。

克服這個問題的另一種方法是使用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);

因此,您可以通過返回指向動態分配數組的第一個元素的指針來使調用者可以使用數組。 在您的情況下,數組的每個元素也是指向動態分配數組的第一個元素的指針。

在你的調用者完成數組后,他們應該釋放它占用的 memory。 在您的情況下,還要釋放每個單獨的字符串占用的 memory - 在釋放主數組之前!

如評論中所述,您不能簡單地交換 arrays 和指針。 根據您的用例,我建議使用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]引用特定的單詞/句子,並且您可以將list作為char **返回:

char **result = list;
return result;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM