0

0

C语言vector用法_C语言实现向量功能的不同方式

幻夢星雲

幻夢星雲

发布时间:2026-01-17 14:13:02

|

793人浏览过

|

来源于php中文网

原创

C语言无内置vector是因设计上追求显式内存控制,需手动实现动态数组;常用“指针+大小/容量”结构模拟,推荐柔性数组成员优化性能,宏泛型易致类型错误,安全做法是专用类型或void*+显式size。

c语言vector用法_c语言实现向量功能的不同方式

为什么C语言没有内置vector

C语言标准库libc)不提供动态数组类型,vector 是 C++ 的容器名,在 C 里直接写 std::vector 会编译失败。这不是遗漏,而是设计取舍:C 追求显式内存控制,所有动态扩容、类型擦除、迭代器等逻辑都得手动实现或借助第三方。

用malloc + 手动管理是最常用且可控的方式

绝大多数嵌入式、系统级 C 项目都采用「指针 + 容量/大小计数」模式模拟 vector 行为。关键不是封装多漂亮,而是避免越界、重复释放、扩容倍数不合理导致的性能抖动。

常见错误现象:

  • 只 realloc 但没更新 sizecapacity,后续 push_back 覆盖未初始化内存
  • 扩容时用 capacity + 1 而非乘性增长(如 ×1.5),频繁 realloc 拖慢性能
  • 释放时只 free(ptr) 却忘了置空指针,造成悬垂指针

实操建议:

立即学习C语言免费学习笔记(深入)”;

  • 定义结构体统一管理:
    typedef struct {
        int *data;
        size_t size;
        size_t capacity;
    } ivec_t;
  • 初始化时设初始 capacity(如 4 或 8),避免首次 push 就 realloc
  • push_back 前检查:if (v->size >= v->capacity),然后 v->capacity *= 2realloc
  • 别省略 realloc 返回值判空 —— 失败时原指针仍有效,但你可能已丢失它

使用C99柔性数组成员(FAM)可减少一次malloc

柔性数组成员允许在结构体末尾声明一个无长度数组,把元数据和数据内存连续分配,提升缓存友好性,也避免两次内存操作。

使用场景:对性能敏感、生命周期明确(如函数内局部 vector)、不需频繁传递裸指针的场合。

BEES企业网站管理系统3.4
BEES企业网站管理系统3.4

主要特性: 1、支持多种语言 BEES支持多种语言,后台添加自动生成,可为每种语言分配网站风格。 2、功能强大灵活 BEES除内置的文章、产品等模型外,还可以自定义生成其它模型,满足不同的需求 3、自定义表单系统 BEES可自定义表单系统,后台按需要生成,将生成的标签加到模板中便可使用。 4、模板制作方便 采用MVC设计模式实现了程序与模板完全分离,分别适合美工和程序员使用。 5、用户体验好 前台

下载

注意点:

  • 必须是结构体最后一个成员,且不能有其他字段在它之后
  • 分配时用 malloc(sizeof(ivec_t) + capacity * sizeof(int))
  • 扩容需 realloc 整个结构体,不能只 realloc 数据段
  • GCC/Clang 支持良好,但 MSVC 对 FAM 支持较晚(VS2019+)

示例结构定义:

typedef struct {
    size_t size;
    size_t capacity;
    int data[];  // 柔性数组成员
} ivec_fam_t;

用宏模拟泛型vector要小心类型擦除和sizeof陷阱

有人用 #define VECTOR(T) struct { T *data; size_t size; size_t capacity; } 实现“泛型”,但宏不解决类型安全问题:传入 char*struct foo* 时,sizeof 错误、memcpy 长度算错、realloc 分配不足都会静默崩溃。

真正可用的方案只有两种:

  • 为每种类型写专用版本(如 ivec_push, svec_push),靠命名区分
  • void* + 用户传入 sizeof(T) 参数(如 vector_push(&v, &item, sizeof(item))),但调用方极易漏传或传错

性能影响:宏展开本身无开销,但缺乏编译期类型检查,调试时堆里全是 void*,gdb 看不到实际元素内容。

C 里所谓 “vector” 本质是内存管理策略的选择:你要确定是否接受额外依赖、能否承担手动维护成本、是否需要跨平台兼容。最易出错的不是扩容逻辑,而是忘记在所有出口(包括 error path)上统一释放或重置状态。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

389

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

613

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

353

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

256

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

597

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

524

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

639

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

599

2023.09.22

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

42

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.5万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.6万人学习

Go 教程
Go 教程

共32课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号