#include <stdio.h>
void Strcat(char* a, char* b);
int main(int argc, const char * argv[]) {
char c[] = "abcdefg";
char d[] = "hijklmn";
Strcat(c, d);
printf("%s\n",c);
}
void Strcat(char* a, char* b)
{
for(; *a!= '\0';a++);
for(; *b != '\0';a++,b++)
{
*a = *b;
}
}
该函数用于复制c末尾的String d。它工作但编译器(XCode)给我一些反馈如下:
0x7fff50716e34 <+0>: movl $0x2000148, %eax ; imm = 0x2000148
0x7fff50716e39 <+5>: movq %rcx, %r10
0x7fff50716e3c <+8>: syscall
-> 0x7fff50716e3e <+10>: jae 0x7fff50716e48. ; <+20> Thread 1: signal SIGABRT
0x7fff50716e40 <+12>: movq %rax, %rdi
0x7fff50716e43 <+15>: jmp 0x7fff5070e0b8 ; cerror_nocancel
0x7fff50716e48 <+20>: retq
0x7fff50716e49 <+21>: nop
0x7fff50716e4a <+22>: nop
0x7fff50716e4b <+23>: nop
错误消息看起来像是一种我几乎无法理解的程序集。我是C的新人,所以有人可以告诉我这意味着什么吗?
答案 0 :(得分:2)
数组c
太小,无法存储其初始值和d
的串联。你在阵列之外写作。
答案 1 :(得分:1)
从标准strcat函数的文档中提示:
追加src指向的以null结尾的字节字符串的副本 到dest指向的以null结尾的字节字符串的末尾。该 character src [0]替换dest末尾的null终止符。该 结果字节字符串以空值终止。
如果目标数组不大,则行为未定义 足够src和dest的内容和终止null 字符即可。如果字符串重叠,则行为未定义。该 如果dest或src不是指向a的指针,则行为未定义 以null结尾的字节字符串。