【问题标题】:Passing an array of strings to a function in C [duplicate]将字符串数组传递给C中的函数[重复]
【发布时间】:2014-11-23 11:07:22
【问题描述】:

我想通过一个函数在 C 中初始化一个字符串数组。我使用了这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void createArrayStrings(char ** listStr){
    listStr = malloc (3 * sizeof(char*));
    listStr[0] = malloc(2 * sizeof(char)); // N chars + '\0'
    listStr[1] = malloc(3 * sizeof(char));
    listStr[2] = malloc(4 * sizeof(char));
    strcpy(listStr[0], "A");
    strcpy(listStr[1], "AB");
    strcpy(listStr[2], "ABC");
}

int main(int argc, const char * argv[]) {
    char ** listStr = NULL;
    createArrayStrings(listStr);
    for (int i = 0;i<3;i++){
        printf("%s\n",listStr[i]);
    }
    return 0;
}

但是 printf 中有一个执行错误 EXEC_BAD_ACCESS。 我的错误在哪里? 谢谢。

【问题讨论】:

    标签: c arrays string parameter-passing


    【解决方案1】:

    您不能在 main 中使用变量 listStr,因为它永远不会填充实际值。当您调用 createArrayStrings 时,您传递的参数按值复制 - 这意味着您在新函数中有一个新副本。 copy 现在填充了您需要的数据,但不是 main 中的原始变量(它仍然为空)。

    最好的方法是让 createArrayStrings 返回 listStr 的值,并在你的 main 函数中将它赋值给 listStr:

    char ** listStr = createArrayStrings();
    

    新的创建函数如下所示:

    void createArrayStrings(){
        char ** listStr = malloc (3 * sizeof(char*));
        ...
        return listStr;
    }
    

    【讨论】:

    • 另外,该函数可以采用一个指向字符串数组的指针,即一个char ***。
    • 是的,这将是堆栈溢出的常见答案(根据我的经验)。但是为什么要给 OP 一个通常被丢弃的解决方案呢?您应该尽可能避免在函数中输出参数。对我来说,退货要好得多。
    • 谢谢。但是,如果我需要在同一个函数中初始化两个不同的字符串数组,我应该如何进行?我猜是使用 char ***。
    • 你必须在同一个函数中进行整个初始化吗?我认为拥有一个创建一个字符串数组的函数要方便得多。一旦您需要第二个数组,您只需再次调用该函数并将其分配给另一个变量。
    • 我只是在指出另一种选择。我同意在这种情况下返回 char** 是理想的。
    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 2016-12-08
    相关资源
    最近更新 更多