首页  >  文章  >  后端开发  >  如何从 C 中的函数安全地返回数组?

如何从 C 中的函数安全地返回数组?

Linda Hamilton
Linda Hamilton原创
2024-10-30 08:16:02158浏览

How do you safely return an array from a function in C  ?

从 C 语言中的函数返回数组

在 C 语言中,从函数返回数组可能是潜在的错误来源,特别是如果数组在堆栈上分配。

考虑以下代码:

<code class="cpp">#include <iostream>

using namespace std;

int* uni(int *a, int *b) {
    int c[10];
    int i = 0;
    while (a[i] != -1) {
        c[i] = a[i];
        i++;
    }
    for (; i < 10; i++)
        c[i] = b[i - 5];

    return c;
}

int main() {
    int a[10] = {1, 3, 3, 8, 4, -1, -1, -1, -1, -1};
    int b[5] = {1, 3, 4, 3, 0};
    int *c = uni(a, b);
    for (int i = 0; i < 10; i++)
        cout << c[i] << " ";
    cout << "\n";

    return 0;
}</code>

在此代码中,uni() 函数创建数组 c 并合并数组 a 中的非负数和 b 进入 c。但是,当代码尝试返回 c 时,数组超出范围,导致返回垃圾值。

为了避免此问题,通常建议将数组作为函数指针传递并返回指针。但是,使用指针可能很麻烦,在某些情况下,最好使用不同的方法。

一种替代方法是使用结构体或类来封装数组并按值返回对象。考虑以下修改后的代码:

<code class="cpp">#include <iostream>

using namespace std;

struct myArray {
   int array[10];
};

myArray uni(int *a, int *b) {
    myArray c;
    int i = 0;
    while (a[i] != -1) {
        c.array[i] = a[i];
        i++;
    }
    for (; i < 10; i++)
        c.array[i] = b[i - 5];

    return c;
}

int main() {
    int a[10] = {1, 3, 3, 8, 4, -1, -1, -1, -1, -1};
    int b[5] = {1, 3, 4, 3, 0};
    myArray c = uni(a, b);
    for (int i = 0; i < 10; i++)
        cout << c.array[i] << " ";
    cout << "\n";

    return 0;
}</code>

在此示例中,uni() 函数返回 myArray 结构的实例。结构体按值返回,并复制其内部数组,确保即使函数返回后值也有效。

以上是如何从 C 中的函数安全地返回数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn