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

标签 c arrays

我的 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/

    相关文章:

    c - 在 bcm2836 上使用 GPIO

    python - 从 Pandas Dataframe 创建分组、堆叠数组

    c - 在不同的功能中分配的空闲内存?

    c - 为什么我的信号处理程序执行两次?

    c - 在C中滚动文本文件

    javascript - 为什么过滤器返回 [object Object]?

    c - 对字符串数组使用动态内存分配

    java - Java 2d int 数组考虑器是否通用?为什么?

    c - 如何用C语言将文件中的数据存储到数组中

    c - 相当于 CUDA 类型转换内在函数 __double2loint、__double2hiint 和 __hiloint2double 的内在函数