问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言中字符数组的长度和大小详解

创作时间:
作者:
@小白创作中心

C语言中字符数组的长度和大小详解

引用
CSDN
1.
https://blog.csdn.net/m0_62778602/article/details/144435059

在C语言中,字符数组的长度和大小是两个不同的概念,它们分别由strlen函数和sizeof运算符计算。本文将通过具体的问题抛出、代码示例和运行结果,详细解释字符串数组的长度和大小如何决定,以及在定义时指定长度对字符串大小和长度的影响。

问题抛出

  1. 字符串数组的长度如何决定?
  • 长度(Length):由strlen函数计算。它返回字符串的实际字符数,不包括结束符\0。例如:
  • 对于strlen(arr),返回的是 5。
  • 对于strlen(arr1),同样返回 5,尽管arr1没有自动添加结束符。
  1. 字符串数组的大小如何决定?
  • 大小(Size):由sizeof运算符计算。它返回数组在内存中占用的总字节数,包括所有字符和结束符\0。例如:
  • 对于char arr[] = "kuuga";sizeof(arr)返回 6。
  • 对于char arr1[] = {'k', 'u', 'u', 'g', 'a'};sizeof(arr1)返回 5。
  1. 字符串定义的时候,指定了长度,对字符串的大小长度有何影响?
  • 当定义一个字符数组并指定其大小时,例如char arr2[99] = "kuuga";,数组的大小是 99 字节。即使仅初始化了 "kuuga",整个数组仍保留 99 字节的内存空间。此时:
  • sizeof(arr2)返回 99,而strlen(arr2)返回 5,因为即使arr2中的有效字符只有 5 个,剩余的空间仍然保留在内存中。

注意事项

  • char arr[] = "kuuga";如果这样定义字符串会自动在末尾添加 \0
  • 字符串大小容易被左右,长度是实打实的东西
#include <stdio.h>
#include <string.h>

int main() {
    char arr[] = "kuuga"; // 自动生成大小,包含结束符
    char arr1[] = {'k','u','u','g','a'}; // 手动指定字符
    printf("第一个字符串的大小(arr[]): %zu 字节\n", sizeof(arr));
    printf("第一个字符串的长度(arr[]): %zu 字符\n", strlen(arr));
    printf("第二个字符串的大小(arr1[]): %zu 字节\n", sizeof(arr1));
    printf("第二个字符串的长度(arr1[]): %zu 字符\n", strlen(arr1));
    char arr2[99] = "kuuga"; // 指定数组大小,自动包含结束符
    char arr3[99] = {'k','u','u','g','a'}; // 指定数组大小,只包含字符
    printf("\n指定数组大小后:\n");
    printf("第一个字符串的大小(arr2[]): %zu 字节\n", sizeof(arr2));
    printf("第一个字符串的长度(arr2[]): %zu 字符\n", strlen(arr2));
    printf("第二个字符串的大小(arr3[]): %zu 字节\n", sizeof(arr3));
    printf("第二个字符串的长度(arr3[]): %zu 字符\n", strlen(arr3));
    return 0;
}

运行结果:

第一个字符串的大小(arr[]): 6 字节
第一个字符串的长度(arr[]): 5 字符
第二个字符串的大小(arr1[]): 5 字节
第二个字符串的长度(arr1[]): 5 字符
指定数组大小后:
第一个字符串的大小(arr2[]): 99 字节
第一个字符串的长度(arr2[]): 5 字符
第二个字符串的大小(arr3[]): 99 字节
第二个字符串的长度(arr3[]): 5 字符
--------------------------------
Process exited after 0.04958 seconds with return value 0
请按任意键继续. . .

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号