注册 登录
编程论坛 C语言论坛

strcat(p, p) 不能正常运行的问题

yiyue123 发布于 2020-03-01 12:45, 3337 次点击
程序代码:

#include<stdio.h>
#include<string.h>
int main(void)
{
    char buffer[20] = "Hello";
    strcat(buffer, buffer);
    printf("%s", buffer);
    return 0;
}

在阅读 bString 源代码时,文档提到了这一点。
使用 mingw32 编译并运行,gdb 调试结果为:
Program received signal SIGSEGV, Segmentation fault.
0x748b6ca9 in strcat () from C:\WINDOWS\SysWOW64\msvcrt.dll

这个问题肯定与内存重叠有关,请教下具体原因是什么。

使用 VS2019,调试时引发异常
0x79CCEE39 (ucrtbased.dll)处(位于 ConsoleApplication1.exe 中)引发的异常: 0xC0000005: 写入位置 0x00900000 时发生访问冲突。

8 回复
#2
forever742020-03-01 13:37
字符串这种东西,在内部终究是要一个字符一个字符处理的,因此strcat (也包括strcpy)的第二参数表达的源串要保证在执行期间保持不变,这样才能正确执行。
而第一参数恰恰指向需要改变的空间。
那么,是改变?还是不变?为了防止CPU思考这个问题的时候烧掉,编译器希望你不要这样写。

简单地说,和你不能直接拉着自己的头发(或者别的部位)把自己提起来的道理是一样的。
#3
叶纤2020-03-01 14:07
程序代码:

strcat的用法是这样的char *strcat( char *dest, const char *src )
src的首字符也就是src[0]替换掉dest终止符号楼主的意思很明显就是想自己替换掉自己
在c上是不允许的,楼上已经说了,是改变还是不改变,
但是从c的标准用法来看是两个不同变量名进行使用的
如果楼主想自己比较自己也不是不可以,那要遵循标准

#include<stdio.h>
#include<string.h>
int main(void)
{
    char buffer[20] = "Hello";
    char buffer_1[20];
    buffer_1[20]=buffer[20];
   strcat (buffer, buffer_1);//不过是乱码啦
    printf("%s", buffer);
    return 0;
}//ps:感谢forever以及r版主教会我指针





[此贴子已经被作者于2020-3-1 14:10编辑过]

#4
yu17761517872020-03-01 14:15
可以运行,运行后是
HelloHello
#5
yiyue1232020-03-01 14:16
多谢解答,明白了
#6
叶纤2020-03-01 14:24
回复 4楼 yu1776151787
为什么我的就不可以结果总是这样的Hello(���或者这样的Hello�n�
#7
yiyue1232020-03-01 14:25
回复 6楼 叶纤
应该是不行的,这样写本来就是错的。你可以问下他用的什么编程环境。
#8
叶纤2020-03-01 14:49
程序代码:
这样就可以啦,我对字符串不怎么熟悉

#include<stdio.h>
#include<string.h>
int main()
{
    char buffer[20] = "Hello";
    char buffer_1[20];

 strcpy(buffer_1, buffer );
  

 strcat (buffer, buffer_1);//OK
    printf("%s", buffer);
    return 0;
}//ps:感谢forever以及r版主教会我指针


#9
lin51616782020-03-05 16:39
以下是引用yu1776151787在2020-3-1 14:15:31的发言:

可以运行,运行后是
HelloHello

内存重叠 属于未定义行为
能运行和不能运行都是正常的
属于错误代码
1