复制char **时会消除Seg故障 - 这是为什么?

时间:2014-03-31 16:21:39

标签: c++ segmentation-fault

class uid
{

public:

    char id[6] = {'0','0','0','0','0','0'};

    uid() {}
    ~uid() {}

    inline void recursive(int x)
    {
        if(':' == id[x])
        {
            id[x] = '0';
            ++id[--x];
            recursive(x);
        }
    }

    char* operator++()
    {
        ++id[5];
        recursive(5);

        return id;
    }

    void write(char* pchar) const
    {
        for(int i = 0; i < 6; ++i)
            pchar[i] = id[i];
    }   
};

using namespace std;

int main(int argc, char** argv)
{   

    const int MAX = 5000000;

    uid c;
    char** arr = new char*[MAX];

    //char** it = arr;

    //loop 1
    for(int i = 0; i < MAX; ++i)
        arr[i] = new char[6];           

    cout << "allocated" << endl;


    //loop 2    
    for(int i = 0; i < MAX; ++i)
    {
        ++c;        
        c.write(arr[i]);
    }   

    cout << "data written" << endl;

    for(int i = 0; i < MAX; ++i) 
        delete[] arr[i];

    cout << "deleting arr" << endl;

    delete[] arr;   

    return 0;   
}

当i == 999999时,运行此操作将导致循环2中的seg错误 - 但是,当添加该行时:

char** it = arr;

seg故障消失了 - 有没有人知道为什么会这样?

由于

2 个答案:

答案 0 :(得分:3)

一旦超过999,999,您就会写入不属于c的内存。声明it会更改内存映射,以至于没有立即的段错误,但代码仍然不正确,任何其他小的更改都可能导致错误。

答案 1 :(得分:1)

以下是如何修复它:

inline void recursive(int x)
{
    if(':' == id[x])
    {
        id[x] = '0';
        if (x) { // <-- added this
            ++id[--x];
            recursive(x);
        }
    }
}

现在溢出将回绕到000000,而不是在不足以容纳它的空间中创建一个7位数字。