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