c ++:我的数组中有一个奇怪的值

时间:2015-04-22 02:53:13

标签: c++ pointers dynamic-arrays

我有一个用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时,我得到一个非常奇怪的错误。

1 个答案:

答案 0 :(得分:2)

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++;
}