标题:strcat(p, p) 不能正常运行的问题
只看楼主
yiyue123
Rank: 2
等 级:论坛游民
威 望:1
帖 子:78
专家分:78
注 册:2018-6-18
结帖率:100%
已结贴  问题点数:20 回复次数:8 
strcat(p, p) 不能正常运行的问题
程序代码:
#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 时发生访问冲突。

搜索更多相关主题的帖子: buffer 调试 strcat include 运行 
2020-03-01 12:45
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:15 
字符串这种东西,在内部终究是要一个字符一个字符处理的,因此strcat (也包括strcpy)的第二参数表达的源串要保证在执行期间保持不变,这样才能正确执行。
而第一参数恰恰指向需要改变的空间。
那么,是改变?还是不变?为了防止CPU思考这个问题的时候烧掉,编译器希望你不要这样写。

简单地说,和你不能直接拉着自己的头发(或者别的部位)把自己提起来的道理是一样的。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-03-01 13:37
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:5 
程序代码:
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编辑过]


把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-01 14:07
yu1776151787
Rank: 2
等 级:论坛游民
威 望:1
帖 子:13
专家分:22
注 册:2020-2-22
得分:0 
可以运行,运行后是
HelloHello
2020-03-01 14:15
yiyue123
Rank: 2
等 级:论坛游民
威 望:1
帖 子:78
专家分:78
注 册:2018-6-18
得分:0 
多谢解答,明白了
2020-03-01 14:16
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
回复 4楼 yu1776151787
为什么我的就不可以结果总是这样的Hello(���或者这样的Hello�n�

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-01 14:24
yiyue123
Rank: 2
等 级:论坛游民
威 望:1
帖 子:78
专家分:78
注 册:2018-6-18
得分:0 
回复 6楼 叶纤
应该是不行的,这样写本来就是错的。你可以问下他用的什么编程环境。
2020-03-01 14:25
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
程序代码:
这样就可以啦,我对字符串不怎么熟悉

#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版主教会我指针



把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-01 14:49
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
以下是引用yu1776151787在2020-3-1 14:15:31的发言:

可以运行,运行后是
HelloHello

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

https://zh.
2020-03-05 16:39



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499485-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046343 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved