上天虹 发表于 2024-11-1 20:32:26

sizeof 输出strcat过的string出现问题

#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写的)

jackz007 发表于 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' 字符为止的字符数,可以理解成水桶里装了多少水,str1 本来有 6 个字符,又通过 strcat() 拼接了 " " 和 "fishc" 后,长度变为 6 + 1 + 5 = 12,这就是 strlen(str1) 的值为 12 的原因。
       如你所见,str1 的容量为 7,却被用来储存了一个需要占用 13 个字符空间的字符串,很显然,str1 越界侵占了不属于自己的存储空间,这必将导致程序运行脱离预定的轨道,出现不确定的运行结果,这肯定不是我们所期望的。所以,写代码的时候,必须为变量预留足够的储存空间,坚决杜绝越界使用存储空间。
页: [1]
查看完整版本: sizeof 输出strcat过的string出现问题