我的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。如何动态分配数组,使其仅包含函数处理后返回的有效数据。
答案 0 :(得分:2)
您需要了解动态和静态分配之间的区别。
有3种选择:
您需要事先知道数组长度。它必须是数字而不是变量:
int out[10];
数组是静态,只是本地作用域。所以如果你这样做:
function do_something()
{
int out[10];
}
您不能在函数外部使用 out 数组。但您可以定义 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上编译),你得到一个自动变量,如果不使用 out ,这非常方便范围,但可能有点危险。生成的数组在堆栈中生成,并在超出范围时被销毁(这就是为什么它可以让您在自由使用时遇到麻烦)。看到 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);
答案 1 :(得分:0)
out
这将生成integer
类型的数组public static Picture fromBitmap(Bitmap src) {
Picture dst = Picture.create((int)src.getWidth(), (int)src.getHeight(), RGB);
fromBitmap(src, dst);
return dst;
}
public static void fromBitmap(Bitmap src, Picture dst) {
int[] dstData = dst.getPlaneData(0);
int[] packed = new int[src.getWidth() * src.getHeight()];
src.getPixels(packed, 0, src.getWidth(), 0, 0, src.getWidth(), src.getHeight());
for (int i = 0, srcOff = 0, dstOff = 0; i < src.getHeight(); i++) {
for (int j = 0; j < src.getWidth(); j++, srcOff++, dstOff += 3) {
int rgb = packed[srcOff];
dstData[dstOff] = (rgb >> 16) & 0xff;
dstData[dstOff + 1] = (rgb >> 8) & 0xff;
dstData[dstOff + 2] = rgb & 0xff;
}
}
}
public static Bitmap toBitmap(Picture src) {
Bitmap dst = Bitmap.create(pic.getWidth(), pic.getHeight(), ARGB_8888);
toBitmap(src, dst);
return dst;
}
public static void toBitmap(Picture src, Bitmap dst) {
int[] srcData = src.getPlaneData(0);
int[] packed = new int[src.getWidth() * src.getHeight()];
for (int i = 0, dstOff = 0, srcOff = 0; i < src.getHeight(); i++) {
for (int j = 0; j < src.getWidth(); j++, dstOff++, srcOff += 3) {
packed[dstOff] = (srcData[srcOff] << 16) | (srcData[srcOff + 1] << 8) | srcData[srcOff + 2];
}
}
dst.setPixels(packed, 0, src.getWidth(), 0, 0, src.getWidth(), src.getHeight());
}
,大小为10。
答案 2 :(得分:0)
您需要out
作为指针 - 而不是数组 - 您需要将指针传递给out
,就像使用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. */