【问题标题】:is malloc better than declaring? [duplicate]malloc 比声明更好吗? [复制]
【发布时间】:2012-12-03 20:14:29
【问题描述】:

可能重复:
Difference between declaration and malloc

有什么区别:

char * a = malloc(size);  

char a[size];  

一个比另一个更好吗?使用malloc有什么好处吗?

【问题讨论】:

  • 请注意,您需要char a[size] 而不是指针。
  • 一个是理智的,如果你不是一个绝对出色的程序员,另一个总是会导致代码损坏。

标签: c


【解决方案1】:

char *a = malloc(size); 和 char *a[size];` 有什么区别?

第一个声明指向char 的指针并在堆上为其分配size 字节。第二个分配sizechar 指针。它们不相等。

一个比另一个更好吗?

不,它们有不同的用途。

使用malloc()有什么好处吗?

是的。如果你想从函数中返回一个数组,你不能这样做:

char a[size];
return a;

因为 a 在返回后超出范围,使用它会导致未定义的行为。所以在这种情况下你必须使用

char *a = malloc(size);
return a;

(通常是这种情况,因为您可能希望每次从函数中返回一个新字符串 - 但是,如果这不是必需的,您可以使用本地声明的静态数组。)

但是,如果数组只用于本地,那么通常建议使用自动(堆栈)数组而不是malloc(),因为这样可以避免增加内存碎片,并且堆栈操作可以比堆访问更快。

【讨论】:

  • “如果你想从一个函数中返回一个数组,......,你必须使用......”并不完全正确——static char a[size]; return a; 也应该可以工作。
  • @JoshuaGreen 我没有写“你不能做static char a[size];”,我写的是“你不能做char a[size];”...
  • @JoshuaGreen 换句话说,使用 static 关键字声明数组不会导致自动数组,因为它的存储持续时间是静态的...
  • 你是最棒的。我现在明白了。非常感谢你们俩
  • 我不同意通过提供替代方案“必须使用char *a = malloc(size); return a;”的说法。
【解决方案2】:

您无法控制堆栈分配内存的生命周期范围,它仅在该范围内有效(除非您将其设为静态)。

malloc 用于在堆上分配内存。在您对该内存调用 free 之前,它一直有效。

在堆栈上分配内存更快,通常是因为您实际上并没有分配新内存,您只是保留了更多已经在使用的内存,但您无法控制生命周期,它由块或函数的范围。

【讨论】:

  • 哇,非常感谢您的快速回答!你能给我一个 malloc 效果更好的例子吗?如果不是要求太多,因为我想知道在哪些情况下声明会失败
  • 堆栈分配在没有剩余堆栈空间时失败,无限递归导致同样的问题,堆栈溢出。堆分配使您可以访问堆,它可能比您保留的堆栈空间大很多,但不是无限的或没有问题。当您打算长时间共享内容时使用堆,但要注意堆碎片等问题。
猜你喜欢
  • 2017-05-06
  • 2015-09-14
  • 2017-09-15
  • 2020-07-22
  • 1970-01-01
  • 2023-04-03
  • 2014-04-11
  • 2012-07-27
  • 2014-08-21
相关资源
最近更新 更多