线程 1:C++ 中的 EXC_BAD_ACCESS(代码=257,地址=0x100000001)
Thread 1: EXC_BAD_ACCESS (code=257, address=0x100000001) in C++
我编写了一个程序来检查给定字符串是否所有字符都是唯一的。我通常写在 Python,但我正在学习 C++,我想用它来编写程序。当我将 Python 翻译成 C++ 时出现错误: Thread 1: EXC_BAD_ACCESS (code=257, address=0x100000001)
我正在使用 Xcode。当我运行这个程序时,我得到上面的错误:
#include <iostream>
using namespace std;
int isUnique(string str) {
int arr[] = {};
for (int i = 0; i < str.length(); ++i) {
arr[i] = 0;
}
for (int j = 0; j < str.length(); ++j) {
arr[j] += 1;
}
for (int k = 0; k < sizeof(arr)/sizeof(arr[0]); ++k) {
if (arr[k] > 1) {
return false;
}
}
return true;
}
int main() {
string str;
cout << "Enter a string: ";
getline(cin, str);
cout << isUnique(str) << endl;
}
这是我在Python中写的原始代码:
def is_unique(string):
chars = []
for i in range(len(string)):
chars.append(0)
chars[string.find(string[i])] += 1 # I am using find and not just i because I want the first occurrence of the substring in the string to update it to 2 if it happens twice, 3 if it is thrice, etc.
for k in chars:
if k > 1: # Note that I'm checking for > 1
return False
return True
# Driver code
if __name__ == "__main__":
print(is_unique("abcd"))
当运行时,输出True
,这意味着该字符串只有唯一字符。将 print(is_unique("abcd")
更改为包含唯一字符的单词的其他内容,例如 print(is_unique("hello")
以获得 False。
当我将其翻译成C++时,Xcode终端显示'(lldb)',Xcode编辑器打开一个文件0_mh_execute_header
,其内容如下:
dsa`_mh_execute_header:
0x100000000 <+0>: .long 0xfeedfacf ; unknown opcode
0x100000004 <+4>: .long 0x0100000c ; unknown opcode
0x100000008 <+8>: udf #0x0
0x10000000c <+12>: udf #0x2
0x100000010 <+16>: udf #0x12
0x100000014 <+20>: udf #0x638
0x100000018 <+24>: .long 0x00218085 ; unknown opcode
0x10000001c <+28>: udf #0x0
0x100000020 <+32>: udf #0x19
0x100000024 <+36>: udf #0x48
0x100000028 <+40>: .long 0x41505f5f ; unknown opcode
0x10000002c <+44>: saddwt z7.h, z10.h, z26.b
0x100000030 <+48>: udf #0x4f52
0x100000034 <+52>: udf #0x0
0x100000038 <+56>: udf #0x0
0x10000003c <+60>: udf #0x0
0x100000040 <+64>: udf #0x0
0x100000044 <+68>: udf #0x1
0x100000048 <+72>: udf #0x0
0x10000004c <+76>: udf #0x0
0x100000050 <+80>: udf #0x0
0x100000054 <+84>: udf #0x0
...
注意:上面的...
表示它继续。 Stack Overflow 只允许正文中包含 30000 个字符,但这将超过 950000
在第 1 行,Xcode 显示错误:文件右侧的 Thread 1: EXC_BAD_ACCESS (code=257, address=0x100000001)
(就像出现编译器问题时通常发生的那样)。
你知道如何解决这个问题吗?
问题出在这里:
int arr[] = {};
C 和 C++ 中的数组不是动态的。你在那里创建的是一个包含 0 个元素的数组,这就是它永远的样子。所以,当你这样做时:
arr[i] = 0;
您正在将数组末尾注销到随机内存中。如果您希望数组与字符串的长度相同,则需要:
int arr[str.size()];
或者,使用向量:
std::vector arr(str.size());
问题出在这里:
int arr[] = {};
您正在创建的数组的长度为 0
,您可以使用
进行验证
cout << "sizeof(arr): " << sizeof(arr) << endl;
当您尝试访问超出数组大小的值时会发生错误:
arr[i] = 0;
你需要做的是指定一个数组的大小,例如int arr[128];
创建一个可以容纳128int
s的数组,它覆盖了7-bit-ASCII的范围。或者使用一个向量,你可以改变它的大小。
我还要指出的是,它的逻辑是行不通的,你可能想要做的是
int isUnique(string str) {
// Create an array that holds 128 ints and initialize it to 0
int arr[128] = {0};
// First loop no longer needed
for (int i = 0; i < str.length(); ++i) {
// Increment count for cell that corresponds to the character
char c = str[i];
arr[c] += 1;
}
// Note that you can reuse variable name when previous one
// has fallen out of scope
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) {
if (arr[i] > 1) {
return false;
}
}
return true;
}
我建议您阅读更多有关 C++ 内存模型的内容。
我编写了一个程序来检查给定字符串是否所有字符都是唯一的。我通常写在 Python,但我正在学习 C++,我想用它来编写程序。当我将 Python 翻译成 C++ 时出现错误: Thread 1: EXC_BAD_ACCESS (code=257, address=0x100000001)
我正在使用 Xcode。当我运行这个程序时,我得到上面的错误:
#include <iostream>
using namespace std;
int isUnique(string str) {
int arr[] = {};
for (int i = 0; i < str.length(); ++i) {
arr[i] = 0;
}
for (int j = 0; j < str.length(); ++j) {
arr[j] += 1;
}
for (int k = 0; k < sizeof(arr)/sizeof(arr[0]); ++k) {
if (arr[k] > 1) {
return false;
}
}
return true;
}
int main() {
string str;
cout << "Enter a string: ";
getline(cin, str);
cout << isUnique(str) << endl;
}
这是我在Python中写的原始代码:
def is_unique(string):
chars = []
for i in range(len(string)):
chars.append(0)
chars[string.find(string[i])] += 1 # I am using find and not just i because I want the first occurrence of the substring in the string to update it to 2 if it happens twice, 3 if it is thrice, etc.
for k in chars:
if k > 1: # Note that I'm checking for > 1
return False
return True
# Driver code
if __name__ == "__main__":
print(is_unique("abcd"))
当运行时,输出True
,这意味着该字符串只有唯一字符。将 print(is_unique("abcd")
更改为包含唯一字符的单词的其他内容,例如 print(is_unique("hello")
以获得 False。
当我将其翻译成C++时,Xcode终端显示'(lldb)',Xcode编辑器打开一个文件0_mh_execute_header
,其内容如下:
dsa`_mh_execute_header:
0x100000000 <+0>: .long 0xfeedfacf ; unknown opcode
0x100000004 <+4>: .long 0x0100000c ; unknown opcode
0x100000008 <+8>: udf #0x0
0x10000000c <+12>: udf #0x2
0x100000010 <+16>: udf #0x12
0x100000014 <+20>: udf #0x638
0x100000018 <+24>: .long 0x00218085 ; unknown opcode
0x10000001c <+28>: udf #0x0
0x100000020 <+32>: udf #0x19
0x100000024 <+36>: udf #0x48
0x100000028 <+40>: .long 0x41505f5f ; unknown opcode
0x10000002c <+44>: saddwt z7.h, z10.h, z26.b
0x100000030 <+48>: udf #0x4f52
0x100000034 <+52>: udf #0x0
0x100000038 <+56>: udf #0x0
0x10000003c <+60>: udf #0x0
0x100000040 <+64>: udf #0x0
0x100000044 <+68>: udf #0x1
0x100000048 <+72>: udf #0x0
0x10000004c <+76>: udf #0x0
0x100000050 <+80>: udf #0x0
0x100000054 <+84>: udf #0x0
...
注意:上面的...
表示它继续。 Stack Overflow 只允许正文中包含 30000 个字符,但这将超过 950000
在第 1 行,Xcode 显示错误:文件右侧的 Thread 1: EXC_BAD_ACCESS (code=257, address=0x100000001)
(就像出现编译器问题时通常发生的那样)。
你知道如何解决这个问题吗?
问题出在这里:
int arr[] = {};
C 和 C++ 中的数组不是动态的。你在那里创建的是一个包含 0 个元素的数组,这就是它永远的样子。所以,当你这样做时:
arr[i] = 0;
您正在将数组末尾注销到随机内存中。如果您希望数组与字符串的长度相同,则需要:
int arr[str.size()];
或者,使用向量:
std::vector arr(str.size());
问题出在这里:
int arr[] = {};
您正在创建的数组的长度为 0
,您可以使用
进行验证
cout << "sizeof(arr): " << sizeof(arr) << endl;
当您尝试访问超出数组大小的值时会发生错误:
arr[i] = 0;
你需要做的是指定一个数组的大小,例如int arr[128];
创建一个可以容纳128int
s的数组,它覆盖了7-bit-ASCII的范围。或者使用一个向量,你可以改变它的大小。
我还要指出的是,它的逻辑是行不通的,你可能想要做的是
int isUnique(string str) {
// Create an array that holds 128 ints and initialize it to 0
int arr[128] = {0};
// First loop no longer needed
for (int i = 0; i < str.length(); ++i) {
// Increment count for cell that corresponds to the character
char c = str[i];
arr[c] += 1;
}
// Note that you can reuse variable name when previous one
// has fallen out of scope
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) {
if (arr[i] > 1) {
return false;
}
}
return true;
}
我建议您阅读更多有关 C++ 内存模型的内容。