gpt4 book ai didi

c - 如何在C中动态分配整数数组

转载 作者:行者123 更新时间:2023-12-04 01:50:37 26 4
gpt4 key购买 nike

我的 C 代码的一部分如下所示。

int data[10]={1,3,6,8,1,7,9,1,1,1}; 
b=10;
int out[b];
process(data, &b, out);
alpha (out, b);

data 和 out 是 int 数组。函数process取b(=10)所指向的数组数据进行数学运算,然后返回一个数组,其长度又由b返回(未知,因此需要动态分配)。然后用函数 alpha 发送数组 out。现在函数 alpha 总是发送 out[10],因为 b 在第二行代码中被声明为 10。如何动态分配数组,使其仅包含函数处理后返回的有效数据。

最佳答案

您需要了解动态分配和静态分配之间的区别。

有3种选择:

  • 静态分配:

  • 您需要提前知道数组长度。它必须是数字而不是变量:
    int out[10];

    数组是 静态 并且仅在本地范围内。所以如果你这样做:
    function do_something()
    {
    int out[10];
    }

    您不能在函数外使用 out 数组。但你可以定义
    外面并像这样发送:
    function do_something(int* out)
    {
    // do things
    }
    ...
    {
    int out[10];
    do_something(out);
    }
  • 自动分配

  • 当你做
    int b = 100;
    int out[b];

    (它不会在没有 -std=c99 或 -std=c11 标志的情况下在 gcc 上编译),你会得到一个自动变量,如果你不超出范围使用它会非常方便,但可能有点危险。结果数组在 堆栈 中生成,并在超出范围时被销毁(这就是为什么如果你随意使用它会给你带来麻烦)。看
    https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Variable-Length.html

    我们建议您使用:
  • 动态分配

  • 上生成数组的位置,您有责任在完成后清理它。缺点是你需要自己清理它。好处是你可以使用传递它并在任何地方使用它。
    int b=100;
    int* out = (int*) malloc(b * sizeof(int));
    // do things with out
    free(out);

    非常重要:
    不要改变 指针 的值。如果这样做,那么您将无法释放适量的内存。一件好事是复制指针,并免费使用复制的地址:
       int b=100;
    int* out = (int*) malloc(b * sizeof(int));
    int* out_copy = out;
    // do things with out. don't touch out_copy
    free(out_copy);

    关于c - 如何在C中动态分配整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40464927/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com