引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字
Unhandled exception thrown: read access violation in simple c++ program that dynamically increase the array length to store numbers
我正在做一个 c++ 作业,允许用户一个接一个地输入数字然后存储在数组中,并动态增加这个数组容量(乘以 2(。 基本上是使用一些基本代码模仿"向量"。
#include<iostream>
using namespace std;
struct myArray {
const size_t initial_size = 1;
const size_t growth_factor = 2;
size_t length = 0;
size_t capacity = initial_size;
int *v; // vector
};
int main() {
int x;
myArray numbers;
while (true) {
cout << "Please input a numebr (program terminated once a -ve number is entered)" << endl;
cin >> x;
if (x < 0)
break;
if (numbers.length == numbers.capacity) {
int *temp = new int[numbers.capacity *= numbers.growth_factor];
for (size_t i = 0; i < numbers.length; ++i)
temp[i] = numbers.v[i];
delete[] numbers.v;
numbers.v = temp;
}
numbers.v[numbers.length++] = x;
}
for (size_t i = 0; i < numbers.length; ++i)
cout << numbers.v[i] << ",";
cout << endl;
return 0;
}
这是我得到的错误,我的第 33 行代码旁边有小红叉: numbers.v[numbers.length++] = x; 当我将鼠标悬停在红十字上时,这是错误:错误消息的图片
Exception thrown: read access violation.
numbers.v was 0x111011101110111. occurred
通过查看我的代码行,我只是将 int 值"x"分配给数组"numbers.v"的第一个元素
我已经尝试寻找其他解决方案,但是我发现其他人的问题要先进得多,并且此读取访问违规错误似乎是由于不同情况下的不同原因造成的。
当你这样做时:
int *v;
您正在创建一个指向 int 的指针,但到目前为止,它仅指向不确定的内存。因此,尝试访问甚至v[0]
也是未定义的行为,并且可能会引发读取访问冲突。initial_size
不正确。v
在一开始没有任何元素,因此v.length
将在循环的第一次迭代时返回0
,并且if
语句的计算结果为 false。然后您将尝试访问
numbers.v[numbers.length++] = x;
这是未定义的行为。
您应该从一个元素开始v
,以便v
的起始大小是正确的:
int* v = new int[1];
另外不要忘记在最后释放内存以避免内存泄漏。
相关文章:
- 数组索引的值没有增加
- 为什么我的代码在输出中增加了93天
- 有效地使用std::unordered_map来插入或增加键的值
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 为什么要增加导致崩溃的指针
- 在运行时增加数组的大小
- 引发未经处理的异常:简单 C++ 程序中的读取访问冲突,动态增加数组长度以存储数字
- 如何通过使用整数指向地址来增加数组
- 使用 char* 增加数组 [C++]
- 在C 中增加数组大小
- 有没有方法可以增加数组的记忆?和相关问题
- 在没有向量、指针的情况下,在c++中的运行时增加数组大小
- 增加数组大小时 CUDA 主体磁贴计算错误代码 77
- 如何在运行时创建和增加数组的大小 C++.
- 在读取文件时,在增加数组大小的同时,将浮点数字读取到动态分配的中
- 尝试动态增加数组大小
- 如何在x86汇编中增加数组
- malloc()总是可以增加数组的大小吗?
- 在c++中动态增加数组大小的更好方法
- 动态数组-如何增加数组的大小