c ++:本地数组定义与malloc调用

Gus*_*ush 6 c c++ arrays malloc

这有什么区别:

somefunction() {  
    ...  
    char *output;   
    output = (char *) malloc((len * 2) + 1);  
    ...  
}  
Run Code Online (Sandbox Code Playgroud)

还有这个:

somefunction() {  
    ...  
    char output[(len * 2) + 1];  
    ...  
}  
Run Code Online (Sandbox Code Playgroud)

什么时候比另一个更合适?

谢谢大家的回答.这是一个总结:

  1. 恩.1是堆分配
  2. 恩.2是堆栈分配
  3. 堆栈有一个大小限制,用于较小的分配
  4. 你必须释放堆分配,否则它会泄漏
  5. 一旦函数退出,就无法访​​问堆栈分配
  6. 在您释放堆分配(或应用程序结束)之前,可以访问堆分配
  7. VLA不是标准C++的一部分

更正欢迎.

这里有一些关于堆与堆栈之间差异的解释:
堆栈和堆的内容和位置是什么?

Ned*_*der 6

第一个在堆上分配内存.你必须记住释放内存,否则它会泄漏.如果内存需要在函数外部使用,或者需要分配大量内存,这是合适的.

第二个在堆栈上分配内存.当函数返回时,它将自动回收.如果您不需要将内存返回给调用者,这是最方便的.


Mar*_*k H 5

当您只有少量数据时使用本地数据,并且您不会使用您声明的函数范围之外的数据.如果您要传递数据,请使用malloc.

局部变量保存在堆栈上,其大小比堆大得多,其中使用malloc分配的数组.我通常会在堆上放置> 16个字节的任何内容,但是你有更多的灵活性.只是不要在kb/mb大小范围内分配本地 - 它们属于堆.

  • 由于问题是关于C++,我强烈反对使用malloc的建议.在C中,使用malloc.在C++中,使用new. (3认同)
  • +1提到堆栈的大小限制,但我认为16字节有点低.大多数平台上的默认堆栈大小不是兆字节(因此在大多数情况下,多KB变量应该没问题)? (2认同)

sea*_*cpp 5

第一个示例从堆中分配一个存储块.第二个从堆栈中分配存储.从somefunction()返回输出时,差异变得可见.动态分配的存储仍然可供您使用,但第二个示例中基于堆栈的存储是,嗯,无处可去.您仍然可以写入此存储并读取它一段时间,直到下次调用函数为止,此时存储将被随机返回,返回地址,参数等.

这个问题中的代码还有很多其他奇怪的东西.首先,这是一个c ++程序,你想要使用new而不是malloc(),所以你会说

output = new char[len+1];
Run Code Online (Sandbox Code Playgroud)

而len*2 + 1又是什么?也许这是你的代码中的特殊内容,但我猜你要分配unicode字符或多字节字符.如果它是unicode,则null终止需要两个字节以及每个字符,并且char是错误的类型,在大多数编译器中是8位字节.如果它是多字节的,那么嘿,所有的赌注都关闭了.