如何在 c++ 中为数组分配大小?
How size is allocated in c++ for array?
如果我们用 4 个元素初始化数组,例如:
int array[4];
我们可以像这样分配值吗,因为它也需要 4 个值:
for(int i=5;i<9;i++){
cin>>array[i];
}
数组上的越界访问具有未定义的行为,这是"意外后果"的另一种说法:
int a[4];
int b[4];
for(int i=5;i<9;i++){
a[i] = i;
}
在调试器中观察它正在做什么,特别是观察b
发生了什么。
这可能会也可能不会崩溃,但它仍然是损坏的代码。C++不会总是提醒您这种情况,但作为开发人员,您有责任了解访问某些结构时允许和不允许的内容。
越界访问数组并不总是会导致崩溃,但总是有问题的。尝试使用i = 999999
或i = -9
,看看会发生什么。
未定义行为的问题在于,它可能看起来有效,但这些意想不到的后果最终会赶上你。这使得调试代码变得非常困难,因为这种越界写入可能会在初始错误发生几分钟或几小时后踩到其他地方需要的变量,然后程序崩溃。这些类型的错误是最令人愤怒的,因为因果关系之间的时间非常长。
这就像在垃圾桶里扔点燃的火柴可能不会每次都引起火灾一样,但是当它确实引起火灾时,你可能直到为时已晚才注意到。在C++你必须非常警惕,不要在代码中引入未定义的行为。
您混合了两个构造 - 用于循环迭代的逻辑和数组的索引。
您可以使用
for(int i=5;i<9;i++){
...
}
运行循环四次。但是,许多人不使用这些i
值来访问数组。数组索引必须适当偏移,使其有效。
for(int i=5;i<9;i++){
int index = i - 5;
std::cin >> array[index];
}
不,你会得到一个有 4 个插槽的数组。这些插槽是
array[0]
array[1]
array[2]
array[3]
所以你的代码不正确。它似乎有效,但由于所谓的未定义行为,它仍然是错误的,下周它可能会失败
注意。你最好在 c++ 中使用 std::vector
我们可以像这样分配值吗,因为它也取了 4 个值:
for(int i=5;i<9;i++){ cin>>array[i];
不,我们不能。由于数组的大小为 4,因此可以访问的唯一索引是 0、1、2 和 3。访问任何其他索引将具有未定义的行为。
尝试在它正在工作的任何在线编译器中运行它。
行为未定义。可能的行为包括,其中没有一个是保证的:
- working
- not working
- random output
- non-random output
- the expected output
- unexpected output
- no output
- any output
- crashing at random
- crashing always
- not crashing
- corruption of data
- different behaviour, when executed on another system
- , when compiled with another compiler
- , on tuesday
- , only when you are not looking
- same behaviour in all of the above cases
- anything else within the power of the computer (hopefully limited by the OS)
- 将数组的地址分配给变量并删除
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 获取字符串的长度并将其分配给数组
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 使用递归模板动态分配的多维数组
- 如何正确填充在堆上分配的二维数组?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 关于字符数组,我正在尝试将数组中的每个字符分配给另一个值
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 无法分配C++数组
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 分配 2D 可变大小的数组
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 动态分配字符数组的内存
- C++具有动态分配的字符数组的结构
- C 通过参考分配 /数组传递内存
- 使用字符串或字符动态分配(数组)