C语言中数组长度的计算方法总结(sizeof与strlen)

C语言中数组长度的计算方法总结(sizeof与strlen)本文章详细介绍了 C 语言常见的定义数组的方式 并且详细讨论了 strlen 与 sizeof 求解数组的原理和使用情况 适合 C 语言的初学者阅读

1. 数组的创建

首先来看看常用的数组的创建形式

  • int型
 int arr1 [10] = { 
   0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0 

通过VS调试中的监视功能,可以看到各个数组的存放结果。

在这里插入图片描述

int arr2 [10] = { 
   1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0 

在这里插入图片描述

int arr3 [10] = { 
   1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义了元素个数,且给所有元素均赋值 

在这里插入图片描述

int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。 

在这里插入图片描述

int arr5[] = { 
   1, 2, 3};//不定义元素个数,给几个元素赋值就有几个元素。 

在这里插入图片描述
注意:
如果你定义了数组的大小(也就是【】号里面写了数字),但是没有给任何元素赋值,那么这个数组的所有元素都默认为一个随机数!!!如果你定义了数组大小,但只给部分元素赋值,那么剩余元素的值默认为0!!!(见上面arr4和arr5)。




因此常用上面arr1的方式,给int型数组的全部元素设置默认值为0.

  • char型
 char arr6[] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0) 

在这里插入图片描述

char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0 

在这里插入图片描述

char arr8 [10] = { 
   'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0 

在这里插入图片描述

char arr9 [10] = { 
   'a', 98, '98'};//char定义数组,元素中出现没有用单引号的数字,会根据ASCII码输出字符 

在这里插入图片描述

 char arr10[] = { 
   'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0) 

在这里插入图片描述
注意:
要格外注意举例中arr10和arr6的不同。同样为插入abc三个字符,但是arr6结尾有\0,arr10却没有,这在下一步求解数组长度的时候有相当大的区别!!!




2. 求解数组的长度

求解数组长度往往要用到两个函数,strlen或者sizeof

  • strlen求解数组长度

strlen是用来求一个字符串(string)的长度,因此strlen不能用来求int类型的数组长度,只能求char类型的数字长度。
具体代码如下:

 char arr6[] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0) printf("length arr6 = %d\n", strlen(arr6)); char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0 printf("length arr7 = %d\n", strlen(arr7)); char arr8 [10] = { 
   'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0 printf("length arr8 = %d\n", strlen(arr8)); char arr9 [10] = { 
   'a', 98, '98'};//char定义数组,元素中出现没有用单引号的数字,会根据ASCII码输出字符 printf("length arr9 = %d\n", strlen(arr9)); char arr10 [] = { 
   'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0) printf("length arr10 = %d\n", strlen(arr10)); 

在这里插入图片描述
注意:
1、从arr6和arr7中可以看出,用双引号定义的字符串数组都能正确计算出数组长度。这是因为这两个数组的末尾都含有结束标志”\0“(具体看前面举例中的截图)。




3、如果用strlen用来求int类型数组的长度,会发现strlen不能用了。

 int arr1 [10] = { 
   0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0 printf("length arr1 = %d\n", strlen(arr1)); int arr2 [10] = { 
   1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0 printf("length arr2 = %d\n", strlen(arr2)); int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。 printf("length arr4 = %d\n", strlen(arr4)); 

在这里插入图片描述

  • sizeof求解数组长度

sizeof能计算变量或者数据类型所占用的内存(以字节为单位)。用sizeof计算数组长度时,sizeof不关心数组内部存储的是什么类型的数据。
所以常常用 sizeof(arr)/sizeof(arr[0]) 来计算数组的长度。其中“sizeof(arr)“计算了整个数组arr占据了多少内存(字节为单位),”sizeof(arr[0])“计算了数组中第一个元素所占多少字节,两者相除就是数组的长度。

代码如下:

 int arr1 [10] = { 
   0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0 int arr2 [10] = { 
   1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0 int arr3 [10] = { 
   1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义了元素个数,且给所有元素均赋值 int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。 int arr5[] = { 
   1, 2, 3};//不定义元素个数,给几个元素赋值就有几个元素。 int len1 = sizeof(arr1) / sizeof(arr1 [0]); int len2 = sizeof(arr2) / sizeof(arr2 [0]); int len3 = sizeof(arr3) / sizeof(arr3 [0]); int len4 = sizeof(arr4) / sizeof(arr4 [0]); int len5 = sizeof(arr5) / sizeof(arr5 [0]); printf("length arr1 = %d\n", len1); printf("length arr2 = %d\n", len2); printf("length arr3 = %d\n", len3); printf("length arr4 = %d\n", len4); printf("length arr5 = %d\n", len5); 

在这里插入图片描述
可以看出,如果你一开始就定义了数组的大小,那么不管你插入多少个元素,求出来的结果永远是你定义的数组大小。
如果你没有定义数组大小,那么算出来的就是你实际赋值的数组大小。




 char arr6 [] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0) char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0 char arr8 [10] = { 
   'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0 char arr10 [] = { 
   'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0) int len6 = sizeof(arr6) / sizeof(arr6 [0]); int len7 = sizeof(arr7) / sizeof(arr7 [0]); int len8 = sizeof(arr8) / sizeof(arr8 [0]); int len10 = sizeof(arr10) / sizeof(arr10 [0]); printf("length arr6 = %d\n", len6); printf("length arr7 = %d\n", len7); printf("length arr8 = %d\n", len8); printf("length arr10 = %d\n", len10); 

在这里插入图片描述
注意:
从arr6可以看出,当用sizeof求char类型数组的长度时,如果你没有定义数组长度,那么得出的结果会比实际大小大1。这是因为sizeof吧数组结尾的\0也算了进去。
从arr7和arr8可以看出,如果定义了数组大小,跟int类型一样,不管怎么定义,定义了多少,结果都是你定义的那个数组大小。
从arr10可以看出,如果你输入数组时用了大括号赋值,并且在结尾没有手动输入\0,那么算出的结果就是实际赋值的个数。








总结:

  1. 定义数组时,要先明确数组的类型(int还是char或者其他类型)。
  2. sizeof不能用来计算已经定义好长度的数组的数组长度(如int arr[10] = {0},不能有中括号里的10)。
  3. strlen不能用来计算int类型的数组长度。
  4. int型计算数组长度,最好用 sizeof(arr) / sizeof(arr[0]) 来计算数组长度。
  5. char型数组如果要计算数组长度,一定要用双引号赋值。
  6. char型数组如果要用大括号赋值,一定要注意数组最后是否需要结束标志 \0
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215725.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午1:35
下一篇 2026年3月18日 下午1:35


相关推荐

  • C语言中的指针详解

    C语言中的指针详解1 指针的定义 C 语言中指针是一种数据类型 指针是存放数据的内存单元地址 计算机系统的内存拥有大量的存储单元 每个存储单元的大小为 1 字节 为了便于管理 必须为每个存储单元编号 该编号就是存储单元的 地址 每个存储单元拥有一个唯一的地址 指针变量除了可以存放变量的地址外 还可以存放其他数据的地址 例如可以存放数组和函数的地址 2 指针的定义和初始化格式 数据类型符 指针变量名 初始地址值 功能 定义指向 数据类型符 的变量或数组的指针变量 同时为其赋初值

    2026年3月18日
    2
  • ucml 连接虚字段

    ucml 连接虚字段转载于 https www cnblogs com Jeely p 10766840 html

    2026年3月18日
    2
  • 矩阵范数的等价性(原创)[通俗易懂]

    矩阵范数的等价性(原创)[通俗易懂]矩阵范数的等价设F=R”role=”presentation”>F=RF=R\mathbbF=\mathbbR或C,”role=”presentation”>C,C,\mathbbC,对于任意两个Fn×n”role=”presentation”>Fn×nFn×n\mathbbF^{n\timesn}上的范数‖⋅&#x

    2025年11月21日
    5
  • Litho的使用–基本使用及加载网络图片

    Litho的使用–基本使用及加载网络图片Litho 的使用你好 这是你第一次使用 Markdown 编辑器所展示的欢迎页 如果你想学习如何使用 Markdown 编辑器 可以仔细阅读这篇文章 了解一下 Markdown 的基本语法知识 新的改变我们对 Markdown 编辑器进行了一些功能拓展与语法支持 除了标准的 Markdown 编辑器功能 我们增加了如下几点新功能 帮助你用它写博客 全新的界面设计 将会带来全新的写作体验 在创作中

    2026年3月18日
    2
  • Mysql 启动命令详解「建议收藏」

    Mysql 启动命令详解「建议收藏」1,找到mysql安装的bin目录,启动mysql进程。如:本机是:C:\ProgramFiles\MySQL\MySQLServer5.7\bin在cmd里切换到此目录,C:\>cdC:\ProgramFiles\MySQL\MySQLServer5.7\binC:\ProgramFiles\MySQL\MySQLServer5.7\bin>查看…

    2022年5月21日
    46
  • 根据IP定位用户所在城市信息

    根据IP定位用户所在城市信息

    2021年10月17日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号