c ++:我的数组中得到了一个奇怪的值

c++: I am getting a wierd value in my array

本文关键字:一个 我的 数组      更新时间:2023-10-16

我有一个任务,要在 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++;
}
相关文章: