下面是一个创建数组的简单程序,该数组与传递的数组相反。该代码在第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);
}
答案 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
获取数组长度参数。这就是它的用途。