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

H.K*_*H.K 3 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);
Run Code Online (Sandbox Code Playgroud)

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

mou*_*mer 6

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

有3种选择:

  • 静态分配:

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

int out[10];
Run Code Online (Sandbox Code Playgroud)

数组是静态的,仅在本地范围内。所以如果你这样做:

function do_something()
{
   int out[10];
}
Run Code Online (Sandbox Code Playgroud)

您不能在函数外使用out数组。但是你可以 外面定义并像这样发送:

function do_something(int* out)
{
   // do things
}
...
{
   int out[10];
   do_something(out);
}
Run Code Online (Sandbox Code Playgroud)
  • 自动分配

当你做

int b = 100;
int out[b];
Run Code Online (Sandbox Code Playgroud)

(不会不-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);
Run Code Online (Sandbox Code Playgroud)

非常重要: 不要改变指针 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);
Run Code Online (Sandbox Code Playgroud)

  • C99 确实如此。它被称为*可变长度数组* (VLA)。当然你不能在函数内部分配它并返回它以在函数外使用,但是,你的开场白是错误的。 (5认同)
  • 这不是重点。纯语句是错误的,“不要使用静态分配”的建议毫无意义。如果代码无法编译,那么 OP 显然不会使用它。事实上,OP 在问题中清楚地说明了这一事实,所以我看不出告诉他/她避免他们 ** 不** 做的事情有什么帮助。 (3认同)