【问题标题】:Returning an array of strings in C在 C 中返回一个字符串数组
【发布时间】:2014-12-18 11:00:24
【问题描述】:

我正在处理一项任务,其中要求我有一个方法返回一个指向字符串数组的指针,该指针是从文件中读取的。该函数有效,但是当我尝试将返回的指针分配给主函数中的变量时,我最终得到一个空值数组。这是我的代码:

#include <stdio.h>

char **buildAnsArray(){

    FILE *in;
    int num, i;

    in = fopen("data.txt", "r");
    fscanf(in, "%d", &num);

    char ansArray[10][num];

    for(i = 0; i < num; i++){
        fscanf(in, "%s", ansArray[i]);
    }

    return ansArray;
};


main(){
    char **ansArray = buildAnsArray();
}

我正在使用的输入文件 (data.txt) 开头为:

3
B
20
1101

ansArray(在 buildAnsArray 中)正确包含 {'B'、'20'、'1101'},但 ansArray(在 main 中)为空。我知道我可以将所有内容都移到 main 中,而不必担心将指针返回到字符串数组,但赋值需要 buildAnsArray 函数。我该怎么做才能解决这个问题?

【问题讨论】:

  • 不是 100% 确定这与您的问题有关,但如果您想从函数返回一个指针,您应该在堆上分配您的数组(使用 malloc)。现在你正在堆栈上创建你的数组,这意味着它可以(并且将会)在你的函数调用之后最终被清理
  • 这有 许多 个不同形式的重复项,但最终归结为:您正在返回一个自动变量的地址(即,一旦您的函数不再存在返回,因此调用未定义的行为)。将更多日志添加到火灾中,生成的指针类型甚至与您声明的函数结果类型不兼容(char** char[][N] 相同)。如果您的编译器没有警告您任何一个,您需要提高警告级别,使其更加详细。
  • 请注意,函数最后一个右大括号后面的分号实际上是一个空声明。不要在不需要的地方写分号。

标签: c arrays string pointers return


【解决方案1】:
char ansArray[10][num];
return ansArray;

是一个临时变量。一旦函数返回,它就会被销毁。

这样做: ...

char** ansArray = malloc(num * sizeof(char*));
for(i = 0; i < num; i++){
    char* item = malloc(10*sizeof(char));

    fscanf(in, "%s", item);
    ansArray[i] = item;

}

... 返回 ansArray;

然后

main(){

    char **ansArray = buildAnsArray();
    printf("%s", ansArray[1]);
    free(ansArray);
}

另外,由于字符串的数量是在函数中分配的,所以你还需要返回 num 以便可以释放 ansarray 中的各个项目,这在上面没有显示。

【讨论】:

  • 问题标记为 C,提示 C++ 代码(newdelete)没有帮助
  • 你到底写了什么? new? delete?这不是作者发布的 C++,而是 C
  • 成功了!我之前尝试过 malloc,但我没想过 malloc 单个项目并将它们添加到数组中。非常感谢!
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
  • 2011-11-06
相关资源
最近更新 更多