关于指针数组的基础

时间:2012-02-11 20:53:39

标签: c arrays pointers

我试图在C中声明一个struct some_struct的指针数组

我可以这样做:

some_struct* arr[10];

而不是:

some_struct** arr=(some_struct**)malloc(10*sizeof(some_struct*));

有什么区别?

4 个答案:

答案 0 :(得分:5)

  • 第一个将数组放在堆栈上。
  • 第二个在堆上分配它。

在第一种情况下,数组的生命周期只是定义它的范围。 当它超出范围时,它将自动释放,因此您无需进行任何清理。

在第二种情况下,数组超出了声明指针的范围。因此,您需要稍后手动free()以避免内存泄漏。

答案 1 :(得分:1)

第一个是在堆栈上分配的。

  • 它的生命周期是周围范围,您不必手动释放它占用的内存,因为当封闭范围结束时它将被释放(据说它具有自动存储持续时间)
  • 这样的编译时数组必须具有常量大小(即,必须在编译时知道大小,而不是运行时。除非您使用的C99允许可变长度数组(VLA)或GCC编译器具有允许的非标准扩展
  • 创建后,无法调整大小

第二个是在堆上分配的。

  • 它的生命周期是在你用free手动解除分配之前(据说动态存储持续时间)
  • 如果在丢失指向它的所有指针之前没有使用free(在这种情况下,在指向它的指针超出范围之前),你将有一个memory leak
  • 可以在运行时确定这些数组的大小
  • 您可以在指向数组的指针上使用realloc来要求C运行时尝试使其更大(或更小)到位(或者如果将其调整到适当位置,则将其移动到更大的内存区域是不可能的)

答案 2 :(得分:0)

第一个将在堆栈中分配,第二个将在堆

中分配

答案 3 :(得分:0)

some_struct* arr[10];将在堆栈上分配内存,而some_struct** arr=(some_struct*)malloc(10*sizeof(some_struct*));将在堆上分配它。