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
:
- ...如果程序试图修改这样的数组,则行为未定义。
您需要在堆中或向量中定义目的地,确保分配正确。
dst = malloc(SIZE);
或
char dst[100];
在第一种情况下,请确保调用 free,在第二种情况下,请确保您不会在其范围之后访问它,或者源不超过 99 个字符+NUL。
我正在用 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
:
- ...如果程序试图修改这样的数组,则行为未定义。
您需要在堆中或向量中定义目的地,确保分配正确。
dst = malloc(SIZE);
或
char dst[100];
在第一种情况下,请确保调用 free,在第二种情况下,请确保您不会在其范围之后访问它,或者源不超过 99 个字符+NUL。