鱼C论坛

 找回密码
 立即注册
查看: 86|回复: 1

sizeof 输出strcat过的string出现问题

[复制链接]
发表于 2024-11-1 20:32:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <string.h>
int main()
{
        char str1[]="i love";
        char str2[]="fishc";
        strcat(str1," ");
        strcat(str1,str2);
        printf("connect over is :%s\n",str1);
        printf("sizeof str1 is :%d\n",sizeof(str1));
        printf("strlen str1 is :%d\n",strlen(str1));
}

********************输出结果***************
connect over is :i love fishc
sizeof str1 is :7
strlen str1 is :12
******************************************
为什么sizeof str1 不是13(devc写的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-1 22:37:27 | 显示全部楼层
本帖最后由 jackz007 于 2024-11-2 17:23 编辑

       sizeof(str1) 取得 str1 的容量,可以理解成,一个水桶的容积,这个值取决于 str1 的定义,"i love" 为 6 个字符,加上末尾的 '\0',一共 7 个字符,所以,sizeof(str1) 是 7;strlen(str1) 取得从 str1[0] 开始,向后扫描,直到遇到第一个到 '\0' 字符为止的字符数,可以理解成水桶里装了多少水,str1 本来有 6 个字符,又通过 strcat() 拼接了 " " 和 "fishc" 后,长度变为 6 + 1 + 5 = 12,这就是 strlen(str1) 的值为 12 的原因。
       如你所见,str1 的容量为 7,却被用来储存了一个需要占用 13 个字符空间的字符串,很显然,str1 越界侵占了不属于自己的存储空间,这必将导致程序运行脱离预定的轨道,出现不确定的运行结果,这肯定不是我们所期望的。所以,写代码的时候,必须为变量预留足够的储存空间,坚决杜绝越界使用存储空间。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 18:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表