| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1126 人关注过本帖
标题:strcat中,字符串长度定义差异导致的结果不同
只看楼主 加入收藏
gleerat
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2009-12-23
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
strcat中,字符串长度定义差异导致的结果不同
程序代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
    char name[8] = "I like ";    //如果使用char *name = "I like ";,也会出现同样结果。
    char *string = "C programming.\n";

    printf("%s\n%ld\n", name, strlen(name));
    strcat(name, string);
    printf("%s%ld\n", name, strlen(name));
    return 0;
}
执行结果(这是在linux下执行的结果):
I like
7
I like C programming.
22
*** stack smashing detected ***: ./test terminated
已放弃 (核心已转储)
程序代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
    char name[9] = "I like ";
    char *string = "C programming.\n";

    printf("%s\n%ld\n", name, strlen(name));
    strcat(name, string);
    printf("%s%ld\n", name, strlen(name));
    return 0;
}
执行结果:
I like
7
I like C programming.
22
向strcat传递的第一个字符串必须足以容纳第二个字符串,所以*name和name[8]都会出错,但是name[9]明显不足一容纳string,但是却正常执行。这是为什么呢?


[ 本帖最后由 gleerat 于 2013-1-9 11:46 编辑 ]
搜索更多相关主题的帖子: 字符串 
2013-01-09 11:01
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:5 
一样会报错啊

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-09 11:21
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
这个问题是编译器 平台 硬件相关的 要探讨必须用汇编 看C语言代码看不出所以然来

而且讨论这个和C语言本身并无关系 这是C的设计思路或者说是个缺陷。。
2013-01-09 11:31
gleerat
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2009-12-23
收藏
得分:0 
回复 2楼 yaobao
    char name[8] = "I like ";    //char name[] = "I like ";也是可以正常使用的
这样使用是没错的,都会输出
D:\>test.exe
I like
7
I like C programming.
22
但是
char *name = "I like ";
会在调用strcat时,程序被异常中止
D:\>test.exe
I like
7
这里都是在Windows 7下使用gcc(32位)编译执行的,主贴中都是在linux下使用gcc(64位)编译执行的。

明察、慎思、笃行
2013-01-09 11:45
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:15 
以下是引用gleerat在2013-1-9 11:45:48的发言:

    char name[8] = "I like ";    //char name[] = "I like ";也是可以正常使用的
这样使用是没错的,都会输出
但是
char *name = "I like ";会在调用strcat时,程序被异常中止
这里都是在Windows 7下使用gcc(32位)编译执行的,主贴中都是在linux下使用gcc(64位)编译执行的。
char *name = "I like "

这个出错不稀奇 因为这个是在静态存储区域的

但关于堆栈的就麻烦了 你1楼的出错信息有啥内涵不知道你查没差 是因为gcc默认开了一个能检测缓冲区溢出的东西 而你这里明显缓冲区溢出了 所以出错退出

至于具体的情况 只能具体分析了 还是那个话 这已经超出了C语言的范围了、、、
2013-01-09 11:56
gleerat
Rank: 2
等 级:论坛游民
帖 子:39
专家分:20
注 册:2009-12-23
收藏
得分:0 
回复 5楼 zklhp
主贴中的出错信息,见过不少了,也没查出个所以然来。
关于堆栈,一无所知。计算机原理没有几乎接触过。

明察、慎思、笃行
2013-01-10 10:59
快速回复:strcat中,字符串长度定义差异导致的结果不同
数据加载中...
 
   



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

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