C - malloc数组在函数中,然后从外部访问数组

时间:2011-12-08 21:17:03

标签: c

这是我如何malloc一个int var然后在函数

之外访问这个var
int f1(int ** b) {
  *b = malloc(sizeof(int)); 
  **b = 5;
}

int main() {
  int * a;
  f1(&a);
  printf("%d\n", *a);
  // keep it clean : 
  free(a);
  return 0;
}

使用上面的相同逻辑,我如何在函数内对一个1 dim数组进行malloc,然后在func之外访问它?

请帮助,我对指向数组的指针感到困惑。

5 个答案:

答案 0 :(得分:12)

以完全相同的方式,但有一些不同的算术。您可以考虑使用一个元素分配数组时现在正在做什么。只需将sizeof(int)乘以您希望数组所拥有的元素数量:

int f1(int ** b, int arrsize) {
  *b = malloc(sizeof(int) * arrsize);

  // then to assign items:
  (*b)[0] = 0;
  (*b)[1] = 1;
  // etc, or you can do it in a loop
}

int main() {
  int * a, i;
  int size = 20;

  f1(&a, size); // array of 20 ints

  for (i = 0; i < size; ++i)
      printf("%d\n", a[i]); // a[i] is the same as *(a + i)
                            // so a[0] is the same as *a

  // keep it clean : 
  free(a);

  return 0;
}

答案 1 :(得分:2)

你几乎就在那里*b = malloc(sizeof(int));为一个int分配空间(因为指针至少与此一样大,所以有点无意义)

更正常的用法是*b = malloc(number_of_ints*sizeof(int));

请记住,[]语法只是为你做了数组数学(a+10)a[10]指向完全相同的内存位置,所以你可以使用malloc分配它,传递poitner并将其称为数组。

复杂的数组和指针的唯一内容(除了记住何时使用*和&amp;)是malloc()以字节为单位工作,所以你需要告诉它int的大小。但它返回的int *知道有关int的内容,因此要获得下一个值,您只需要执行a++a+1a[1],即使它实际上是4或8个字节价值不同。

答案 2 :(得分:1)

(未经测试,但我相信它会起作用)

int f1(int ** b) {
  *b = malloc(sizeof(int)*4); 

  (*b)[0] = 5;
  (*b)[1] = 6;
  (*b)[2] = 7;
  (*b)[3] = 8;
}

int main() {
  int * a;
  f1(&a);
  printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]); // should be "5 6 7 8"
  // keep it clean : 
  free(a);
  return 0;
}

答案 3 :(得分:0)

而不是malloc()一个int,malloc数组。

int f1(int * b) {
  b = malloc(ARRAY_LENGTH * sizeof(int)); 
  *b = 5;
  b[1] = 6;
  *(b + 2) = 7;
}

答案 4 :(得分:0)

您需要使用calloc来代替malloc(请参阅:http://www.manpagez.com/man/3/calloc/