我正在做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上运行时会出现总线错误。我不明白为什么......
答案 0 :(得分:5)
在您的代码中
char *s = "Hello ";
s
指向字符串文字,它位于只读内存位置。所以,问题是双重的
尝试更改字符串文字的内容会调用undefined behaviour。
(几乎忽略第1点)目标指针没有足够的内存来保存连续的最终结果。内存溢出。再次undefined behaviour。
您应该使用数组(位于读写内存中),其长度足够来保存生成的(最终)字符串(无内存溢出)。< / p>
建议:不要对用户定义的函数使用与库函数相同的名称。使用其他名称,例如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);
答案 1 :(得分:1)
在最后一个地址指向
后添加't'的文字char *s = "Hello ";
char *t = "world\n";
但是在's'之后写入是未定义的行为,因为编译器可能将该文本放在常量内存中,在你的情况下它会崩溃,所以它实际上就是这样。
你应该通过使用malloc或声明数组样式
来保留s指向的足够内存char s[32] = "Hello ";