鱼C论坛

 找回密码
 立即注册
查看: 2027|回复: 4

[技术交流] 当strlen大于sizeof时

[复制链接]
发表于 2016-8-23 16:47:21 | 显示全部楼层 |阅读模式

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

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

x
最近在看字符串处理函数strcat想到一个问题:

strcat(dest,src) 当拼接二者字符串时,需要dest的存储空间大于src
当运行
#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "love";
        char str2[] = "FishC";
    printf("sizeof str1 = %d\n", sizeof(str1));
        printf("strlen str1 = %u\n", strlen(str1));
        
        
        strcat(str1, " ");
        printf("sizeof str1 = %d\n", sizeof(str1));
        printf("strlen str1 = %u\n", strlen(str1));
        strcat(str1, str2);
        printf("str1: %s\n", str1);
        printf("sizeof str1 = %d\n", sizeof(str1));
        printf("strlen str1 = %u\n", strlen(str1));



        return 0;
}


发现其结果显示str1的字符长度大于字符的储存,产生了数组越界的问题,希望鱼油大神们能科普下数组越界和内存储存的关系,谢谢~
12.PNG

strlen vs sizeof

strlen vs sizeof
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-24 11:14:41 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-24 11:39:46 | 显示全部楼层
新人一枚,说点我知道的吧

字符数组判定结束的标志是\0知道吧,当字符数组长度不够时,会继续按照数组地址连续储存,并在结束后加上\0,这也是为什么定义指针数组的时候可以省略长度,而单独设定一个参数为数组长度。

以题目为例,char str1[] = "love";实际上在内存中一共储存了love\0共计5个元素,此时数组初始化完成,元素固定为5个不变,所以sizeof一直都是5,但是strlen的判定是以\0为结束标志的,计算\0前的字符串个数,当数组长度不够时,会继续连续向后存储,形成连续的字符串,这时str只是相当于字符串数组的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-24 19:04:16 | 显示全部楼层
谢谢,明白了,其实数组名是固定的地址,如果用指针定义的话其实就变化了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-25 09:50:42 | 显示全部楼层
oshapeman 发表于 2016-8-24 19:04
谢谢,明白了,其实数组名是固定的地址,如果用指针定义的话其实就变化了

用指针应该更得不到答案吧
char *p;
sizeof(p) == 4;
这里,sizeof得到的是字符指针的大小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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