2017-09-22 54 views
2

我想用下一个代码解决的问题是将某个大小的整数数组旋转到某个数字。 例如,对于C++指针:数组的堆栈已损坏

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

其中size =5,为shift = 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; 

,但我不明白,究竟是什么错。
在此先感谢您的帮助。

+0

就这么你知道,这已经存在了:'std :: rotate' – chris

回答

6

a = &a[1];由1

移位指针a所以a[-1]a[3]包容现在有效索引的范围:a[size - 1]违反了。

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

0

正如已经拔示巴所指出的,a = &a[1];(其具有完全一样++a;a++;效果相同)移动与分配a[size - 1] = l;写入存储旁边的阵列效果的指针。取决于调用rotate的代码是否发生错误。我刚刚运行了rotate以及合适的main而没有错误消息(无论是在编译过程中还是在运行时)。

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

为了更好地理解程序在做什么,我已经取代了一些语句与这样具有完全相同的效果:

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

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

+0

你的代码在内存中移动数组,而不会将第一个数组推到末尾。所以你在输入和输出上有相同的数字行,而“a [size - 1] = l;”我旋转一点线,添加先前的数字到数组的末尾。但我同意,这个额外的变量“L”并不是真的需要,解决方案也不是严格正确的。 – riverhare

+0

我刚刚重写了您的代码,以帮助您更好地理解它。这完全不是**问题的解决方案。重点是:你的代码(和上面的问题一样)**和我的答案中的代码完全一样。当你在循环中移动指针'a'时,就不会轻易看到它。 – Fabian