C ++数组反向器中的EXC_BAD_ACCESS错误

时间:2015-06-08 22:48:06

标签: c++ arrays exc-bad-access

下面是一个创建数组的简单程序,该数组与传递的数组相反。该代码在第6行引发以下错误:Thread 1: EXC_BAD_ACCESS (code=1, address=0x7fff0000002c)。程序编译,逻辑似乎很好。有人可以解释我的错误吗?

void arrayReverser(int array[], int arrayLength) {
    int arrayNew[arrayLength];
    int current;  
    current = array[0];

    for(int i = 0; current != '\0'; current = array[++i]) {
        arrayNew[i] = array[arrayLength - i]; // Thread 1 error code occurs here
    }

    array = arrayNew;
}

int main() {
     int array[] = { 2, 3, 4, 5, 6, 7 };
     arrayReverser(array, 6);
}

3 个答案:

答案 0 :(得分:4)

您的问题是检查for循环:

当前!='\ 0'

这应该是对数组长度的检查,而不是数组中元素的值,这可以用来反转空终止字符串。

答案 1 :(得分:3)

看起来你有两个问题。首先,您的阵列反向器逻辑用于基于阵列中不存在的终结器进行循环。您应该根据数组长度循环。

其次,您的arrayReverser函数正在堆栈上分配返回值(arrayNew)。当方法结束时,将自动释放堆栈分配的局部变量。您需要在堆上分配返回值以使用new或malloc返回它 - 并在main中使用delete / free释放它。

如果您希望将数组保持在主体中而不是使用动态分配,则可以改为使用值来分配值,如下所示:

#include <iostream>

void arrayReverser(int array[], int arrayLength) {
    int arrayNew[arrayLength];

    // Reverse the array using array length as terminator
    for( int i=0; i <= arrayLength; i++ ) {
        arrayNew[arrayLength-i] = array[i-1];
    }

    // Assign elements back to original array, instead of assigning array pointer
    for( int i=0; i < arrayLength; i++ ) {
       array[i] = arrayNew[i];
    }
}

int main() {
     int array[] = { 2, 3, 4, 5, 6, 7 };
     arrayReverser(array, 6);

    // Output reveresed array
    for( int i=0; i < 6; i++ ) {
       std::cout << array[i] << std::endl;
    }
}

这是有效的,因为它重新使用发送的数组作为结果 - 并且你的“arrayNew”变量可以安全地被销毁而不被使用。这个数组元素的“深层复制”保留了原始数组的分配。

答案 2 :(得分:1)

查看此行中的循环延续条件:

for(int i = 0; current != '\0'; current = array[++i]) {

您将循环直到遇到NUL('\ 0')字符(其整数值为0)。

您传入的数组末尾没有零“哨兵”。 看起来你打算使用arraylength参数,然后有一个'大脑放屁'。

代码只是在数组末尾运行,然后在某处执行非法访问。

PS:请使用size_t获取数组长度参数。这就是它的用途。