c ++:我的数组中得到了一个奇怪的值
c++: I am getting a wierd value in my array
我有一个任务,要在 c++ 中创建 Arraylist(从 1d 数组),并且我让每个方法都起作用,但我在我的数组中得到了一个奇怪的值,我没有添加。基本上,当我添加到我的数组时,如果我的数组中的项目数等于数组的长度,我会将数组的大小加倍。当我的数组长度达到 length=8 时,在 arr[6] 中有一个值 33。这是内存问题吗?此位置应为 0。
这是我的CPP:
#include<iostream>
#include<string>
#include<sstream>
#include "ArrayList.h"
using namespace std;
void ArrayList:: intialArr(int arr[])
{
cout << "intialArr ran" << endl;
for(int i = 0; i < length; i++)
{
arr[i] = 0;
}
}
std::string ArrayList:: toString()
{
cout << "{ ";
for(int i = 0; i < capacity; i++)
{
cout << "arr[" << i << "] = " << arr[i] << " ";
}
cout << " }";
}
ArrayList::ArrayList()
{
length = 1;
capacity=0;
arr = new int[length];
cout << "length = " << length << " " << "capacity = " << capacity << endl;
intialArr(arr);
cout << "ArrayList created"<<endl;
}
int& ArrayList:: operator[] (unsigned int i)
{
cout << "operator[] is working" << endl;
int *p = &arr[i];
return *p;
}
void ArrayList:: push_back(int m)
{
if(capacity>=length)
{
length = length*2;
cout << "length = " << length << endl;
int* curArr = new int[length];
intialArr(curArr);
for (int i = 0; i<length; i++)
{
if(arr[i])
{
cout << "arr[" << i << "] in pushback method(if) is: " << arr[i]<< endl;
curArr[i] = arr[i];
}
else
{
cout << "arr[" << i << "] in pushback method(else) is: " << arr[i] << endl;
curArr[i] = 0;
}
}
delete [] arr;
arr = curArr;
}
for(int i = 0; i < length; i++)
{
if(arr[i]==0)
{
arr[i] = m;
capacity++;
cout << "arr at " << i << " is: " << arr[i];
cout << " and should be: " << m << endl;
cout << "capacity is: " << capacity << endl;
break;
}
}
}
void ArrayList:: erase(int m)
{
for(int i = 0; i < length; i++)
{
if(arr[i]==m)
{
for(int j = i; j<length; j++)
{
arr[j] = arr[j+1];
cout<< "arr[" << j << "] is: " << arr[j] << " and should be: ";
cout << arr[j+1] << endl;
}
capacity--;
cout << "capacity is: " << capacity << endl;
}
}
if((length/capacity) == 2)
{
length = length/2;
cout << "length = " << length << endl;
int* curArr = new int[length];
intialArr(curArr);
for (int i = 0; i<length; i++)
{
if(arr[i])
{
cout << "arr[" << i << "] in pushback method(if) is: " << arr[i]<< endl;
curArr[i] = arr[i];
}
else
{
cout << "arr[" << i << "] in pushback method(else) is: " << arr[i] << endl;
curArr[i] = 0;
}
}
delete [] arr;
arr = curArr;
}
}
int main()
{
ArrayList arr;
arr.push_back(1);
arr.push_back(1);
arr.push_back(1);
arr.push_back(1);
arr.push_back(1);
arr.push_back(1);
}
这是我的数组的结果:
arr[0] in pushback method(if) is: 1
arr[1] in pushback method(if) is: 1
arr[2] in pushback method(if) is: 1
arr[3] in pushback method(if) is: 1
arr[4] in pushback method(if) is: 1
arr[5] in pushback method(if) is: 1
arr[6] in pushback method(if) is: 33
arr[7] in pushback method(else) is: 0
并且不允许使用向量,当我尝试硬编码 arr[6]=0 时,我得到一个非常奇怪的错误。
push_back()
中的以下代码块是导致未定义行为的原因,因为您正在越界访问arr
。
for (int i = 0; i<length; i++)
{
if(arr[i])
{
cout << "arr[" << i << "] in pushback method(if) is: " << arr[i]<< endl;
curArr[i] = arr[i];
}
else
{
cout << "arr[" << i << "] in pushback method(else) is: " << arr[i] << endl;
curArr[i] = 0;
}
您需要保存旧长度,使用旧长度将数据从arr
复制到curArr
,然后继续将输入参数添加到新数组中。
此外,检查:
if(arr[i]==0)
只要您不将0
推送到阵列就可以了。
我会将push_back
修改为:
void ArrayList:: push_back(int m)
{
if(capacity>=length)
{
int oldLength = length;
length = length*2;
cout << "length = " << length << endl;
int* curArr = new int[length];
intialArr(curArr);
for (int i = 0; i < oldLength; i++)
{
curArr[i] = arr[i];
}
delete [] arr;
arr = curArr;
}
arr[capacity] = m;
capacity++;
}
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 为什么我的最后一个 ELSE 条件无法正确执行
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 我的输出中有一个额外的 0,为什么会这样
- 我可以在具有一个标头和一个接口的 cpp 文件中有多个嵌入吗?
- 使用Visual Studio在虚幻引擎中创建一个新的类c ++给了我太多的错误
- 如何将我编写的对象传递到另一个类的构造函数中?
- 我正在尝试创建一个菜单,但我的代码一直在循环
- 插入一个基本的单向链表节点似乎破坏了我的 c++ 代码?