oshapeman 发表于 2016-8-23 16:47:21

当strlen大于sizeof时

最近在看字符串处理函数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的字符长度大于字符的储存,产生了数组越界的问题,希望鱼油大神们能科普下数组越界和内存储存的关系,谢谢~

cosmosh73 发表于 2016-8-24 11:14:41

看看

zzxwbs 发表于 2016-8-24 11:39:46

新人一枚,说点我知道的吧

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

以题目为例,char str1[] = "love";实际上在内存中一共储存了love\0共计5个元素,此时数组初始化完成,元素固定为5个不变,所以sizeof一直都是5,但是strlen的判定是以\0为结束标志的,计算\0前的字符串个数,当数组长度不够时,会继续连续向后存储,形成连续的字符串,这时str只是相当于字符串数组的地址

oshapeman 发表于 2016-8-24 19:04:16

谢谢,明白了,其实数组名是固定的地址,如果用指针定义的话其实就变化了

夏目悠 发表于 2016-8-25 09:50:42

oshapeman 发表于 2016-8-24 19:04
谢谢,明白了,其实数组名是固定的地址,如果用指针定义的话其实就变化了

用指针应该更得不到答案吧
char *p;
sizeof(p) == 4;
这里,sizeof得到的是字符指针的大小
页: [1]
查看完整版本: 当strlen大于sizeof时