C ++指针:数组的堆栈已损坏

时间:2017-09-22 14:58:11

标签: c++ pointers

我想用下一个代码解决的问题是将某个大小的整数数组旋转到一定的数字移位。 例如,

int a[5] = {1,2,3,4,5}

其中size =5shift = 2,结果必须为

{3,4,5,1,2}

这是我的功能

void rotate(int a[], int size, int shift)
{
    for (int i = 0; i < shift%size; ++i) {
        int *buffer = &a[0];
        a = &a[1];
        int l = *buffer;
        a[size - 1] = l;
    }
}

输出正确,但存在运行时异常

Stack around the variable 'a' was corrupted

问题肯定在

a[size - 1] = l;

但我无法理解,到底出了什么问题 在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

a = &a[1];正在将指针a移动1。

所以a[-1]a[3]包含现在是有效索引的范围:a[size - 1]违反了该索引。

我建议不要以这种方式改变a

答案 1 :(得分:0)

正如Bathsheba已经声明的那样,a = &a[1];(与++a;a++;具有完全相同的效果)会移动指针,其作用是赋值a[size - 1] = l;写入数组旁边的内存。它取决于调用rotate的代码,无论是否发生错误。我刚刚运行rotate和一个合适的main而没有错误消息(在编译期间和运行时都没有)。

rotate不可能产生正确的输出。它根本不会旋转任何东西,而只是将数组的一部分写入数组旁边的内存中。看起来好像旋转了一些东西,当数组有足够的可用内存时(否则数据被覆盖),以及当你在调用rotate的代码中更改数组的startadress时。 / p>

为了更好地理解程序的作用,我用一些语句替换了一些语句具有完全相同的效果:

void rotate(int a[], int size, int shift) {
    for (int i = 0; i < shift%size; ++i) {
        // buffer was superfluous
        ++a;
        // l was superfluous
        a[size - 1] = a[-1];
    }
}

以下内容与您的程序具有完全相同的效果:

void rotate(int a[], int size, int shift) {
    for (int i = 0; i < shift%size; ++i) {
        a[size + i] = a[i];
    }
}

现在您可以很容易地看到,必须更改算法才能按要求工作。