我们本可以使用普通数组
C++中(至少今年),数组具有静态大小;因此,从运行时值创建一个数组:
int lis[n];
不允许使用“p
”标签。一些编译器允许这种非标准扩展,但它将在明年成为标准;但是,现在如果我们想要一个动态大小的数组,我们必须动态分配它。
在C语言中,这意味着要使用malloc
函数;但是你问的是关于C++,所以你需要
std::vector<int> lis(n, 1);
分配一个包含初始化为1的int值的大小为n
的数组。
(如果您愿意,您可以使用new int[n]
分配数组,并在完成后记得用delete[] lis
释放它,并且要特别小心不要泄漏内存,如果抛出异常; 但是生命太短暂了,不值得这样做。)
好吧,我不完全明白 malloc 的工作原理,它实际上是做什么的。因此,为我解释它们将更有益处。
C语言中的malloc
和C++中的new
都从“自由存储区”分配持久性内存。与局部变量的内存不同,它会在变量超出范围时自动释放,但这种内存会一直存在,直到您明确释放它(在C中使用free
,在C++中使用delete
)。如果需要数组超出当前函数调用的生命周期,这是必需的。如果数组非常大,则这也是个好主意:局部变量(通常)存储在堆栈上,堆栈大小有限。如果溢出,程序将崩溃或出现其他问题。(而且,在当前标准的C++中,如果大小不是编译时常量,则这是必需的。)
假设我们在上面的代码中用
n
替换
sizeof(int) * n
,然后尝试存储整数值,我可能会遇到什么问题?
你没有为
n
个整数分配足够的空间;因此,假设您有的代码将尝试访问超出分配空间末尾的内存。这将导致未定义的行为;如果你很幸运,会崩溃,如果你不幸,会导致数据损坏。
那么有没有办法直接从分配的内存空间中打印变量存储的值,例如这里是
lis
?
你的意思是像这样吗?
for (i = 0; i < len; ++i) std::cout << lis[i] << '\n';
malloc
和C++并不是最好的朋友。 - Marc Claesenmalloc
。在这种情况下,唯一可接受的解决方案是std::vector<int> lis( n );
。 - James Kanze