C++数组反向器中的EXC_BAD_ACCESS错误
EXC_BAD_ACCESS error in C++ array reverser
下面是一个简单的程序,用于创建一个与传递的数组相反的数组。该代码在第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
。这就是它的目的。
相关文章:
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- "400 Bad request"使用 OpenSSL BIO 进行请求时
- 解密文件AES_256_CBC返回"bad decrypt"错误
- 在C++流中,eof(),fail(),bad()和good()有什么区别
- make / gcc:"bad build"的可能原因是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 在多线程环境中,什么可能导致"bad file descriptor"?
- "std::vector"在调整大小时引发"bad allocation"异常
- 尝试使用 execp、dup2 和管道实现 shell,挂起或"bad file descriptor"
- OpenCV SVM 在火车上抛出异常,"Bad argument (There is only a single class)"
- 成员函数 bad() 的 std::ftsream 用于检查
- 使用 boost::asio 和 boost::thread 时"Bad file descriptor"
- OpenCV C++神经网络 predict() 函数抛出"Bad argument"错误