我正在阅读K&R并尝试使用指针编写strcat版本(将一个字符串附加到另一个字符串的末尾).这就是我所拥有的:
#includevoid mystrcat(char *s,char *t) { while(*s++); *s--; while(*s++ = *t++); } int main() { int size = 1024; char *s1, *s2; s1 = malloc(size); s2 = malloc(size); s1 = "Hello "; s2 = "World"; mystrcat(s1,s2); printf("%s",s1); return 0; }
该程序运行但直接崩溃,对指针不是很有经验,所以无法解决错误.
问题出在这里:
s1 = malloc(size); s2 = malloc(size); s1 = "Hello "; s2 = "World";
你已经为s1
和分配了空间s2
,但是不是使用它,而是让它们指向字符串文字.这些字符串文字存储在内存的不可写的位置(即,你不应该乱用它).
简而言之,您必须将代码更改为:
s1 = malloc(size); s2 = malloc(size); strcpy( s1, "Hello " ); strcpy( s2, "World" );
现在您正在使用分配的空间.希望这可以帮助.
编辑:你这里也有问题:
void mystrcat(char *s,char *t) { while(*s++); *s--; while(*s++ = *t++); }
第二行应该是s--
,而不是*s--
.*s--
会减少指针s
并访问新位置.您实际上不需要取消引用指针只是为了减少它.您只希望指针在指向现在之前指向一个位置.那很简单s--
.