char * buf = malloc(sizeof(char *)* 16)vs char buf [sizeof(char *)* 16]

时间:2012-03-01 04:52:32

标签: c arrays memory-management

我正在阅读

的C代码

char * buf = malloc(sizeof (char *) * 16)

而不是

char buf[sizeof (char *) * 16]

有什么区别?好吧,我认为第一个表达式是不必要的,如果没有调用realloc(),或者我错了思考?

4 个答案:

答案 0 :(得分:5)

char buf[sizeof(char*)*16]是自动分配的数组,通常是堆栈。只要buf在范围内,并且有足够的堆栈空间,它就是有效的。

malloc从一些堆中分配内存。在此内存为free()之前有效。通常,可用的堆更多。

答案 1 :(得分:1)

Yann的说明是正确的。

这似乎是一个指针数组。因为它分配的内存是char指针大小的16倍。指针大小可能因系统而异。有些指针是32位(4字节),其他指针是64位(8字节)。

char buf [sizeof(char *)* 16]不是一个指针数组,它是一个字符数组,其元素等于char指针的大小为16。

答案 2 :(得分:1)

动态数组

第一个是dynamic array。表达式char * buf = malloc(sizeof (char *) * 16)将元素存储在内存中(malloc基本上用于内存分配)。使用它的优点是,您可以重新分配它,即在运行时调整它。但是,每次添加新元素时,可能必须分配新内存。这是一个例子:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main() {
  int* array;
  int n, i;
  printf("Enter the number of elements: ");
  scanf("%d", &n);
  array = malloc(n*sizeof(int));
  for (i=0; i<n; i++) {
  printf("Enter number %d: ", i);
  scanf("%d", &array[i]);
  }
  printf("\nThe Dynamic Array is: \n");
  for (i=0; i<n; i++) {
  printf("The value of %d is %d\n", i, array[i]);
  }
  printf("Size= %d\n", i);
  getch();
  return 0;
}

输出:

Output

自动(静态?)数组

第二个表达式char buf[sizeof (char *) * 16]只声明了一个无聊的自动数组。它的大小是静态的。没有动态调整大小,重新分配等。

注意:为malloc之前的类型转换道歉。如果你做错了,那么对malloc的返回值进行类型转换会导致编译器没有错误。接下来可能是未定义的运行时错误和调试地狱。始终避免对malloc的结果进行类型转换。谢谢@Lundin。

答案 3 :(得分:0)

主要区别在于,如果这是代码在函数中,您仍然可以在返回后使用前者声明的指针。