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

我的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数组。 函数进程获取长度由b(= 10)指向的数组数据并执行数学运算,然后返回一个数组,其长度再由b返回(未知,因此需要动态分配)。 然后使用函数alpha发送数组输出。 现在函数alpha总是发出[10],因为b在第二行代码中被声明为10。 如何动态分配数组,使其仅包含函数进程后返回的有效数据。

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

有3种选择:

  • 静态分配:

您需要事先知道数组长度。 它必须是数字而不是变量:

 int out[10]; 

Array是静态的 ,仅在本地作用域。 所以如果你这样做:

 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上编译),您将获得一个自动变量,如果您不使用超出范围,这是非常方便的,但可能有点危险。 生成的数组在Stack中生成,并在超出范围时被销毁(这就是为什么如果你自由使用它会让你陷入麻烦)。 请参阅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); 
 int *out; out=(int *) malloc(sizeof(int) * 10); 

这将产生大小为10的integer类型的数组。

你需要成为一个指针 – 而不是一个数组 – 你需要传递一个指向函数的指针,就像你用b做的那样。

例:

 void f(int **a, int *size) { *a = malloc(23 * sizeof(**a)); *size = 23; } /* ... */ int *p = NULL; int b = 0; f(&p, &b); /* 'p' has been allocated and 'b' has its size. */