我的 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。如何动态分配数组,使其仅包含函数处理后返回的有效数据。
您需要了解动态分配和静态分配之间的区别。
有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)