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

时间:2016-11-07 12:12:55

标签: 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);

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

3 个答案:

答案 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. */