BAD_ACCESS_ERR 在 c 中的简单字符串复制函数中

BAD_ACCESS_ERR in a simple string copy function in c

我正在用 c 实现一个基本的字符串复制函数,如下所示:

void copy(char* src, char* dst) {
    while (*src) {
        *dst = *src;
        dst++, src++;
    }
}

我这样称呼它:

int main(int argc, char* argv[]) {
    char* src = "Hello World!";
    char* dst = "AAAAAAAAAAAA";

    printf("Source: %s | Des: %s\n", src, dst);
    copy(src, dst);
    printf("Source: %s | Des: %s", src, dst);
}

用lldb调试时,我知道copy中的src和dst是有效的指针。然而,当 *dst = *src 执行时,我的程序被抛出一个 BAD_ACCESS_ERR。这怎么可能?编译器应该为 src 和 dst 静态分配内存。就字符串长度而言,两者大小相等。该错误甚至不会在空终止字符上抛出,它会在第一次执行 assign 语句时抛出。我没看到什么?这是 macOS 特有的吗?

char* dst = "AAAAAAAAAAAA";

您将目标定义为指向一段只读的内存 -- C 标准允许将字符串文字保存在只读段中。 6.4.5p6 String literals:

  1. ...如果程序试图修改这样的数组,则行为未定义。

您需要在堆中或向量中定义目的地,确保分配正确。

dst = malloc(SIZE);

char dst[100];

在第一种情况下,请确保调用 free,在第二种情况下,请确保您不会在其范围之后访问它,或者源不超过 99 个字符+NUL。