线程 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];创建一个可以容纳128ints的数组,它覆盖了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++ 内存模型的内容。