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

EXC_BAD_ACCESS error in C++ array reverser

本文关键字:EXC BAD ACCESS 错误 数组 C++      更新时间:2023-10-16

下面是一个简单的程序,用于创建一个与传递的数组相反的数组。该代码在第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 != ''; 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);
}

您的问题是for循环中的检查:

current!='\0'

这应该是对数组长度的检查,而不是对数组中元素的值的检查,不过这可以反转以null结尾的字符串。

看起来有两个问题。首先,数组反向器逻辑用于基于数组中不存在的终止符进行循环。您应该改为基于数组长度进行循环。

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

如果您喜欢保持数组在main中的完整性,而不是使用动态分配,您可以在适当的位置分配值,如下所示:

#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"变量可以安全地销毁,而无需使用。数组元素的这种"深度复制"保留了原始数组的分配。

看看这一行中的循环延续条件:

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

循环直到遇到NUL("\0"(字符(其整数值为0(。

您传入的数组末尾没有零"sentinel"。看起来你本想使用arraylength参数,然后就"脑放屁"了。

代码只是从数组的末尾运行,然后在某个地方执行非法访问。

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