【问题标题】:C return char array from function [duplicate]C从函数返回char数组[重复]
【发布时间】:2018-05-09 15:06:06
【问题描述】:

基本上,我正在做的是制作一个可以用来构建其他程序的基础程序,并且我有一个函数(称为输入),它返回从用户输入中收集的字符。现在,有两个错误说“return make integer without a cast”和“函数返回局部变量的地址”。我希望它能够做的是返回一个字符数组。

代码如下:

#import <stdio.h>

void cls() {
    system(cls);
}

char input() {
    char X[0];
    int Y = 0;
    char Z;
    while (1 == 1) {
        Y = Y + 1; //increment step
        Z = getch(); //get character input
        if (Z == ';') {
            break;
        } //break if stop character is pushed
        char Q[Y];
        int a;
        for (a = 0; a < Y; a = a + 1) {
            Q[a] = X[a];
        } //pass the items of X to the larger Q array
        Q[Y] = Z; //add new value to Q at end of array
        char X[Y];
        int b;
        for (b = 0; b < Y + 1; b = b + 1) {
            X[a] = Q[a];
        } //pass the items of Q back to a larger X
        printf(X);
    }
    return X;
}

int main() {
    while (1 == 1) {
        //stuff will go here later
    }
    return 0;
}

【问题讨论】:

  • 'char* input()'
  • 您有 多个 个名为 X 的数组,每个数组彼此不同。然后返回顶级的X,它是 empty (实际上是不允许的)。此外,返回指向本地数组元素的指针将返回一个无效指针,因为数组超出范围并立即停止退出。
  • 你还有很多其他的错误,比如#import是什么? getch (or rather _getch) function 返回一个 int (如果你想从中检查错误,这很重要,你应该这样做)。如果您尝试调用 cls 函数,它可能会崩溃。也许是时候让你退后几步了,get a good beginners book or two,然后重新开始。
  • 那我应该如何修复代码呢?将值传递给Q后删除X,然后重新声明X,和Q一样吗?
  • “将值传递给 Q 后删除 X,然后重新声明 X”——这听起来根本不对。你应该得到a good C book 来学习。 C 不是一种靠猜测来学习的好语言。这可能是我在 SO 上看到的关于从函数返回数组的第五个问题。当然,您可以通过搜索找到一些答案。

标签: c arrays char return


【解决方案1】:

数组不是 C 中的一等类型,因此您不能从函数中返回它们,也不能将它们作为参数传递给函数。您需要改为传递/返回指针。但是由于指针必须指向某些东西(才有用),所以您需要跟踪谁“拥有”指针所指的内容——谁负责分配和释放所涉及的内存。

也就是说,有几种方法可以管理传递和返回(指向)数组。

  • 您可以让调用者分配一个数组(在堆栈或堆上),并将指向该数组的指针(和大小)传递给将填充它的函数。在这种情况下被调用的函数不必担心分配和释放数组,但需要担心不会溢出。

  • 您可以让被调用者在堆上分配一个数组并返回一个指向调用者的指针。您不能对被调用者堆栈分配的内存执行此操作,因为当被调用者返回时,所有被调用者堆栈分配的内存都会被释放,因此如果您尝试返回指向它的指针,则指针将悬空。堆分配的数组避免了这个问题,但意味着调用者需要释放它,并且调用者不知道分配的数组有多大的额外困难,除非你返回一个包含该信息的结构以及 th 指针,或者以某种方式将该信息传达给调用者。

【讨论】:

    【解决方案2】:

    你应该做到以下几点:

    错误提示“return make integer without a cast”

    将函数input的返回类型从char更改为char *

    错误提示“函数返回局部变量的地址”

    内存返回我的变量X 应该分配dynamically 即使用callocmalloc 函数。因为在提供的代码中,内存保存我的变量X 是本地的并且存在于stack 中。所以当函数调用从

    返回时

    【讨论】:

    • 或者在main()中声明X,并将指向X的指针和大小作为参数传递给函数。
    猜你喜欢
    • 2018-10-18
    • 2020-02-21
    • 2013-01-03
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多