alloca()在堆栈上而不是在堆上分配内存,如同的情况一样malloc().所以,当我从例程返回时,内存被释放.所以,实际上这解决了我释放动态分配内存的问题.释放分配的内存malloc()是一个令人头痛的问题,如果不知何故错过会导致各种内存问题.
alloca()尽管有上述特征,为什么不鼓励使用?
const int sizea = 600;
char sz[sizea];
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常。但下面的代码段会导致错误。我正在开发 Visual Studio 2005 - MFC 应用程序
CString strFinal;
.......//strFinal value is dynamically changing . .
const int size = strFinal.GetLength();
char sz[size];
Run Code Online (Sandbox Code Playgroud)
错误 2 错误 C2057:预期的常量表达式
错误 5 错误 C2070:'char []':非法 sizeof 操作数
错误 4 错误 C2133:'sz':未知大小 错误 3 错误 C2466:无法分配常量大小 0 的数组
我以为我应该得到allData的以下char数组定义的编译错误:
void MyClass::aMethod(const char* data, int size)
{
int headerSize = 50;
MyHeader header;
//size is not constant and unknown at compile time
char allData[size + headerSize]; //<<<<<==== should not allowed!! but not error??
memcpy(allData, &header, headerSize);
memcpy(allData + headerSize, data, size);
....
}
Run Code Online (Sandbox Code Playgroud)
为什么?它会产生运行时错误吗?
当我尝试编译我的程序时,我收到以下错误:
main.cpp: In function ‘int main()’:
main.cpp:67: error: cannot convert ‘int (*)[(((long unsigned int)(((long int)mapSizeY) - 1)) + 1u)]’ to ‘int (*)[10]’ for argument ‘3’ to ‘void initializeMap(int, int, int (*)[10])’
main.cpp:68: error: cannot convert ‘int (*)[(((long unsigned int)(((long int)mapSizeY) - 1)) + 1u)]’ to ‘int (*)[10]’ for argument ‘3’ to ‘void paintMap(int, int, int (*)[10])’
Run Code Online (Sandbox Code Playgroud)
我的代码看起来像这样:
#include <iostream>
using namespace std;
void initializeMap(int mapSizeX, int mapSizeY, int map[][10])
{
// Map details:
// 0 = # (wall)
// 1 …Run Code Online (Sandbox Code Playgroud) int len = GetWindowTextLengthW(hwndEdit) + 1;
wchar_t text[len];
Run Code Online (Sandbox Code Playgroud)
我明白了
错误2错误C2466:无法分配常量大小的数组0
错误3错误C2133:'text':未知大小
错误1错误C2057:预期的常量表达式
我不明白为什么它不会编译,因为GetWindowTextLengthW(hwndEdit)+ 1> 0
null + 1 = 1不是真的吗?