掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

C语言获取数组长度的多种方法详解(静态数组、字符串数组、STL容器)

先纠正一个常见误区:严格来说C语言没有STL,STL是C++标准库的内容,包括vector、list、map等。如果代码里能写std::vector,那说明编译的是C++,获取长度用size()。C语言里对应的是自己封装动态数组、使用glib的GArray、或者用stc这类第三方容器库。搞清这一点,能避免在C项目里到处找不存在的接口。下面按静态数组、字符串数组、容器三类分别说明。

一、静态数组:用sizeof宏计算元素个数

最常见写法是sizeof(arr)/sizeof(arr[0]),前者是整个数组占用的字节数,后者是单个元素的字节数,相除就是元素个数,适合编译期就能确定大小的数组。

建议封装成宏,例如#define ARRAY_LEN(a) (sizeof(a)/sizeof((a)[0])),使用时更简洁,也能减少手误。

最大的坑是数组退化为指针。数组作为函数参数传递时会变成指针,此时sizeof返回的是指针大小,在64位系统上通常是8,算出来的长度完全错误,必须在调用处把长度作为额外参数传进去。

动态分配的内存同样不能用sizeof,malloc返回的是指针,sizeof只能得到指针大小,长度需要自己用变量记录,这是C语言手动管理内存的常见代价。

C11可以用_Generic或编译期断言做一定保护,也可以在宏里判断参数是否为数组类型,避免误传指针后静默出错。

二、字符串数组:区分字符数组长度和字符串长度

如果是字符数组,sizeof(buf)得到的是整个缓冲区字节数,包含结尾的空字符,实际可用容量是sizeof减1。

如果想知道字符串实际长度,用strlen,它从头遍历直到遇到结束符,返回的是不含结束符的字符个数,和缓冲区容量不是一回事。

strlen不会检查越界,如果字符串没有正确写入结束符,会一直向后读取导致崩溃或信息泄露,使用strcpy、strcat时尤其要注意,优先用strncpy、strncat并手动补结束符,或者使用安全性更好的snprintf。

如果是字符串指针数组,比如char *arr[],元素个数仍然可以用sizeof除以sizeof(arr[0]),因为每个元素是指针,算出来的是指针数量。

如果数组靠空指针结尾,可以遍历统计直到遇到NULL,这种方式不依赖sizeof,适合长度在运行时变化的场景。

三、容器与C++ STL:用size接口并维护长度字段

C++中vector、string、deque等容器都提供size(),直接返回元素个数,string还能用length,两者通常等价,空容器返回0。

使用vector时不要依赖容量capacity判断元素数量,capacity是已分配空间,可能大于size,混用容易逻辑出错。

如果在C语言里自己实现动态数组,标准做法是结构体里同时保存数据指针、元素个数size和容量capacity,对外提供获取长度的函数,由代码统一维护,避免靠遍历猜测。

使用glib时可以用GArray、GPtrArray,通过len字段或g_array_get_length获取长度,同时注意释放元素和数组本身,防止内存泄漏。

如果项目是C但需要类似STL的能力,可以考虑stc这类头文件库,它提供类似vector的容器和size接口,能减少手写动态数组的出错概率,但引入前要考虑团队维护和编译兼容性。

C语言获取数组长度的多种方法详解(静态数组、字符串数组、STL容器)

C语言获取数组长度的核心在于判断拿到的是数组还是指针。编译期确定的静态数组可以用sizeof除以首元素大小,并封装成宏提高可读性;一旦数组传入函数或来自malloc,就会退化为指针,sizeof失效,必须显式传递或记录长度。字符串要区分缓冲区容量和strlen得到的实际长度,并确保结束符存在,优先使用带长度限制的函数。所谓STL属于C++,容器直接用size获取长度,不要和capacity混淆,C项目里可以用自维护size字段的结构体、glib容器或stc替代。养成在接口设计上明确传长度的习惯,比任何技巧都更能避免越界和崩溃。

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 研学创作

    包含研学创作(大纲)和研学创作(全文)

    包含研学创作(大纲)和研学创作(全文)

  • 调研综述

    通过请求综述题目、指定文献ID集合、生成模式及学科名称,以流式方式返回生成的调研综述全文及引用的参考文献信息。

    通过请求综述题目、指定文献ID集合、生成模式及学科名称,以流式方式返回生成的调研综述全文及引用的参考文献信息。

  • 智能选题

    通过请求问题内容、学科名称及选题目的,返回包含中英文题目、推荐理由、多维度评分及相似文献的智能选题推荐结果。

    通过请求问题内容、学科名称及选题目的,返回包含中英文题目、推荐理由、多维度评分及相似文献的智能选题推荐结果。

  • 学术对话

    通过自然语言请求,选择以流式或非流式方式返回模型生成的对话回复及相关的参考文献引用信息。

    通过自然语言请求,选择以流式或非流式方式返回模型生成的对话回复及相关的参考文献引用信息。

  • 会议文献检索及详情

    包含会议文献和会议文献详情

    包含会议文献和会议文献详情

0512-88869195
客服微信二维码

微信扫码,咨询客服

数 据 驱 动 未 来
Data Drives The Future