在堆或堆栈上分配的动态创建的字符串 - C
Dynamically created string allocated on heap or stack - C
上下文
我正在尝试在不分配堆内存的情况下获取 C++ C 字符串,并在测试中遇到了这个问题:
#include <stddef.h>
#include <stdlib.h>
char* get_empty_c_string(size_t length) {
char buffer[length];
char *string = buffer;
for (size_t i = 0; i ^ length; i++) *(string + i) = ' ';
return string;
}
int main(void) {
char *string = get_empty_c_string(20u); // Allocated on heap?
// or stack?
return 0;
}
问题
返回的 C 字符串是在堆上还是在堆栈上分配?
据我所知:
堆分配发生在
calloc
、malloc
&realloc
C标准函数或new
&new[]
C++关键字。大多数其他情况下的堆栈分配。
数组buffer
是一个可变长度数组(VLA(,这意味着它的大小是在运行时确定的。 作为函数的局部变量驻留在堆栈上。 然后,指针string
指向该数组,并返回该指针。 由于返回的指针指向超出范围的局部堆栈变量,因此尝试使用该指针将调用未定义的行为。
另请注意,VLA 是仅限 C 的功能。
在标准C++中无法获取自动存储持续时间的运行时大小的内存(通常映射到堆栈内存(。
因此,无法在堆栈上获得任何长度的适当字符串。您只能分配最大大小的缓冲区,并在程序中使用最大长度的字符串。(类似的事情通常由所谓的短字符串优化std::string
完成。
此外,不能从函数返回具有自动存储持续时间的变量的指针或引用。当函数返回时,变量被销毁,指针/引用变得无效。在函数返回之前,您只能使用堆栈分配。但是,您可以按值返回变量。
正如@PaulMcKenzie指出的,get_empty_c_string()
的实现将无法编译: 本质上,作为函数的临时/实例变量的数组需要在编译之前为它们定义静态大小。这是因为该内存量在函数调用时被推送到堆栈上。
我可以看到您正在尝试将动态内存分配作为函数本身的一部分,这就是您需要这样的堆分配器的原因。
相关文章:
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本
- 如何在C++中为堆栈动态创建结构?
- 如何使用类型级函数动态创建静态类型?
- 如何在动态创建的CMFCToolbar的工具提示中添加描述?
- 如何设置动态创建的CMFCToolbar的原始状态?
- 我可以动态创建新地图并作为函数参数传递吗?
- 如何在循环中动态创建变量(c++)
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- 在堆或堆栈上分配的动态创建的字符串 - C
- "动态创建的事件处理程序"复选框
- 在字符串数组中动态创建和存储数据
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 无法将动态创建的对象数组从 qml 发送到 c++ 作为方法参数
- 为动态创建的数组使用静态关键字有什么意义吗?
- 有没有办法基于文本文件动态创建对象?
- 从类 c++ 动态创建数组
- 如何在循环中动态创建类对象?
- 动态创建 std::vector 并将其传递给另一个函数的各种方法
- 使用 createComponent 动态创建 QML 对象