C++ 使用指针写入strcat()时出错

C++ 使用指针写入strcat()时出错,c++,c,arrays,pointers,kernighan-and-ritchie,C++,C,Arrays,Pointers,Kernighan And Ritchie,我正试图通过K&R的C编程语言学习C。我正在尝试使用指针编写strcat()程序 char *strcat (char *s, char *t){ char *d; d = s; while(*s++); s--; while(*s++ = *t++); return d; } int main () { char *name1; char *name2; name1 = "stack" ; name2 = "ov

我正试图通过K&R的C编程语言
学习C。我正在尝试使用指针编写
strcat()
程序

char *strcat (char *s, char *t){
    char *d;
    d = s;
    while(*s++);
    s--;
    while(*s++ = *t++);
    return d;
}

int main () {
    char *name1;
    char *name2;
    name1 = "stack" ;
    name2 = "overflow";
    printf("%s %s\n", name1, name2);
    printf("strcat out : %s", strcat(name1, name2));
    return 0;
}
但我得到的结果是

stack overflow
Segmentation fault

为什么它不起作用?有人能澄清一下这个错误吗?

因为指针是指向文本的指针,而不仅仅是那些只读的指针,目的地不够大,无法同时包含这两个字符串。对于至少
string1
,您需要使用至少足够大的数组来包含两个字符串(包括终止符)。比如:

在这方面:

while(*s++ = *t++);

您可以取消引用
s
,它指向一个超过字符数组
“堆栈”
。这会导致分段错误。

程序试图将字符附加到文本字符串
“堆栈”
。不要那样做;创建一个足以容纳结果的字符数组,将第一个字符串复制到数组中,然后
strcat
字符串的其余部分

哦,给你的函数命名,而不是
strcat
。这个名字已经被取了

 char *name1;
 char *name2;
 name1 = "stack" ;
 name2 = "overflow";
==>


这是C还是C++?为什么两个标签都有?@Doorknob-两种语言的答案都一样。你需要学习数组和指针,声明你的
char name1[SIZE]
字符名称2[大小]
和replace赋值语句
name1=“stack”as
strcpy(名称1,“堆栈”)
strcpy(名称2,“溢出”)读取:while(*s++)之后的
可能重复
s--。可以将指针指向超过数组末尾的一个指针。正如@johnchen902所说,一旦找到了端点,代码就会递减指针。Thanx,我已经改进了我的答案,那么我应该在这个程序中做什么修改呢?@noufal这是在我的答案中。我在互联网上发现,我们需要给declare-like
char*name1=malloc(100*sizeof(char))。但是这也不起作用。@noufal这也不正确,因为您后来将指针指定给指向文本字符串,这会使您丢失由
malloc
返回的原始指针。相反,您需要将文本字符串顶部复制到数组中。请看我的最新答案。
while(*s++ = *t++);
 char *name1;
 char *name2;
 name1 = "stack" ;
 name2 = "overflow";
 char name1[20];
 char name2[10];
 memcpy(name1,"stack") ;
 memcpy(name2,"overflow");