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