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)
什么时候比另一个更合适?
谢谢大家的回答.这是一个总结:
更正欢迎.
这里有一些关于堆与堆栈之间差异的解释:
堆栈和堆的内容和位置是什么?
第一个在堆上分配内存.你必须记住释放内存,否则它会泄漏.如果内存需要在函数外部使用,或者需要分配大量内存,这是合适的.
第二个在堆栈上分配内存.当函数返回时,它将自动回收.如果您不需要将内存返回给调用者,这是最方便的.
当您只有少量数据时使用本地数据,并且您不会使用您声明的函数范围之外的数据.如果您要传递数据,请使用malloc.
局部变量保存在堆栈上,其大小比堆大得多,其中使用malloc分配的数组.我通常会在堆上放置> 16个字节的任何内容,但是你有更多的灵活性.只是不要在kb/mb大小范围内分配本地 - 它们属于堆.
第一个示例从堆中分配一个存储块.第二个从堆栈中分配存储.从somefunction()返回输出时,差异变得可见.动态分配的存储仍然可供您使用,但第二个示例中基于堆栈的存储是,嗯,无处可去.您仍然可以写入此存储并读取它一段时间,直到下次调用函数为止,此时存储将被随机返回,返回地址,参数等.
这个问题中的代码还有很多其他奇怪的东西.首先,这是一个c ++程序,你想要使用new而不是malloc(),所以你会说
output = new char[len+1];
Run Code Online (Sandbox Code Playgroud)
而len*2 + 1又是什么?也许这是你的代码中的特殊内容,但我猜你要分配unicode字符或多字节字符.如果它是unicode,则null终止需要两个字节以及每个字符,并且char是错误的类型,在大多数编译器中是8位字节.如果它是多字节的,那么嘿,所有的赌注都关闭了.