我们可以使用一个普通的数组
在 C++ 中(至少今年是这样),数组具有静态大小;所以从运行时值创建一个:
int lis[n];
不被允许。一些编译器允许将其作为非标准扩展,明年将成为标准;但是,现在,如果我们想要一个动态大小的数组,我们必须动态分配它。
在 C 语言中,这意味着搞乱malloc
; 但你问的是 C++,所以你想要
std::vector<int> lis(n, 1);
分配一个大小数组,n
其中包含int
初始化为 1 的值。
(如果你愿意,你可以用 分配数组new int[n]
,并记得delete [] lis
在完成后释放它,如果抛出异常,请特别注意不要泄漏;但生命太短暂了,不适合这种废话。)
好吧,我不明白 malloc 是如何工作的,实际上是什么。所以解释它们对我来说会更有益。
malloc
在 C 和new
C++ 中,从“免费存储”中分配持久内存。与局部变量的内存不同,当变量超出范围时会自动释放,这会一直存在,直到您显式释放它(free
在 C 中,delete
在 C++ 中)。如果您需要数组比当前函数调用更有效,这是必要的。如果数组非常大,这也是一个好主意:局部变量(通常)存储在堆栈上,大小有限。如果溢出,程序将崩溃或出错。(并且,在当前的标准 C++ 中,如果大小不是编译时常量,则它是必要的)。
假设我们sizeof(int) * n
只替换n
上面的代码,然后尝试存储整数值,我可能会遇到什么问题?
您没有为n
整数分配足够的空间;因此假设您拥有的代码将尝试访问超出分配空间末尾的内存。这将导致未定义的行为;运气好的话会崩溃,运气不好的话会损坏数据。
有没有办法直接从内存分配的空间打印存储在变量中的值,例如这里是lis
?
你的意思是这样的?
for (i = 0; i < len; ++i) std::cout << lis[i] << '\n';