使用指针在我自己的 strcat 中出现总线错误
Bus error in my own strcat using pointer
我正在做 strcat
函数的指针版本,这是我的代码:
void strcat(char *s, char *t);
int main(void) {
char *s = "Hello ";
char *t = "world\n";
strcat(s, t);
return 0;
}
void strcat(char *s, char *t) {
while (*s)
s++;
while ((*s++ = *t++))
;
}
这看起来很简单,但是在我的 Mac OS 10.10.3 上 运行 时它会出现总线错误。我不明白为什么...
在你的代码中
char *s = "Hello ";
s
指向 字符串文字 ,它位于 只读 内存位置。所以,问题是双重的
尝试更改 字符串文字的内容 调用 undefined behaviour.
(几乎忽略点 1) 目标指针没有足够的内存来保存连接的最终结果。内存溢出。再次 undefined behaviour.
您应该使用数组(驻留在读写内存中)具有足够的长度来保存结果(最终)字符串相反(没有内存溢出)。
建议:用户自定义函数不要和库函数重名。使用其他名称,例如 my_strcat()
.
伪代码:
#define MAXVAL 512
char s[MAXVAL] = "Hello";
char *t = "world\n"; //are you sure you want the \n at the end?
然后
my_strcat(s, t);
您要在最后一个地址 s 指向
之后添加 't' 的文本
char *s = "Hello ";
char *t = "world\n";
但是在 's' 之后写入是未定义的行为,因为编译器 可能 将该文本放入常量内存中,在您的情况下它会崩溃,所以它确实会崩溃。
你应该在 s 指向的地方保留足够的内存,使用 malloc 或声明它为数组样式
char s[32] = "Hello ";
我正在做 strcat
函数的指针版本,这是我的代码:
void strcat(char *s, char *t);
int main(void) {
char *s = "Hello ";
char *t = "world\n";
strcat(s, t);
return 0;
}
void strcat(char *s, char *t) {
while (*s)
s++;
while ((*s++ = *t++))
;
}
这看起来很简单,但是在我的 Mac OS 10.10.3 上 运行 时它会出现总线错误。我不明白为什么...
在你的代码中
char *s = "Hello ";
s
指向 字符串文字 ,它位于 只读 内存位置。所以,问题是双重的
尝试更改 字符串文字的内容 调用 undefined behaviour.
(几乎忽略点 1) 目标指针没有足够的内存来保存连接的最终结果。内存溢出。再次 undefined behaviour.
您应该使用数组(驻留在读写内存中)具有足够的长度来保存结果(最终)字符串相反(没有内存溢出)。
建议:用户自定义函数不要和库函数重名。使用其他名称,例如 my_strcat()
.
伪代码:
#define MAXVAL 512
char s[MAXVAL] = "Hello";
char *t = "world\n"; //are you sure you want the \n at the end?
然后
my_strcat(s, t);
您要在最后一个地址 s 指向
之后添加 't' 的文本char *s = "Hello ";
char *t = "world\n";
但是在 's' 之后写入是未定义的行为,因为编译器 可能 将该文本放入常量内存中,在您的情况下它会崩溃,所以它确实会崩溃。
你应该在 s 指向的地方保留足够的内存,使用 malloc 或声明它为数组样式
char s[32] = "Hello ";