上一篇
📚 数据结构大揭秘:定长顺序存储让字符串“住”进固定小窝 🏠
💻 想象一下,你正在开发一个文本编辑器,用户输入的每个字符都需要被妥善保存,突然,产品经理甩来需求:“必须保证内存占用绝对可控!”这时候,定长顺序存储就像一个“规划大师”,用固定大小的数组给字符串安排得明明白白,今天咱们就扒一扒这种存储方式的底层逻辑和实现技巧!
就是给字符串分配一个固定长度的连续内存空间,就像给每个字符串安排一个“独栋小别墅”,比如定义 #define MAX_SIZE 100
,所有字符串都住进这个100平米的房子里,超出的部分会被无情“截断”。
特点速览:
用C语言举个栗子,我们给字符串结构体开“两室一厅”:
#define MAX_LEN 255 // 小区最大户型 typedef struct { char ch[MAX_LEN + 1]; // 255平米的房间(+1是给'\0'留车位) int length; // 实际住了多少个字符 } SString;
关键设计:
ch[]
数组:连续存储字符,末尾默认加\0
表示结束(也可以像某些实现那样用length
字段记录长度)length
字段:避免每次都要strlen()
遍历计算长度void InitString(SString *s) { s->length = 0; // 空房状态,length=0 }
bool StrAssign(SString *s, const char *chars) { int len = strlen(chars); if (len > MAX_LEN) return false; // 户型太小,装不下! strcpy(s->ch, chars); s->length = len; return true; }
bool Concat(SString *result, SString s1, SString s2) { if (s1.length + s2.length > MAX_LEN) { // 户型太小,只能保留部分 memcpy(result->ch, s1.ch, s1.length); memcpy(result->ch + s1.length, s2.ch, MAX_LEN - s1.length); result->length = MAX_LEN; return false; // 标记为“截断版” } strcpy(result->ch, s1.ch); strcat(result->ch, s2.ch); result->length = s1.length + s2.length; return true; // 完整合并成功! }
bool SubString(SString *sub, SString s, int pos, int len) { if (pos < 0 || pos > s.length || len < 0 || pos + len > s.length) return false; // 非法操作! strncpy(sub->ch, s.ch + pos, len); sub->length = len; return true; }
场景 | 定长顺序存储 | 动态数组(如C++的std::string ) |
---|---|---|
内存占用 | 固定浪费 | 按需分配,可能碎片化 |
插入/删除 | 需移动元素 | 类似,但动态扩容更灵活 |
随机访问速度 | 🌟 超快 | 同样快(底层也是数组) |
处理超长字符串 | 💔 截断 | ✅ 自动扩容 |
假设要开发一个用户系统,昵称最长允许8个汉字(16个字节):
#define NICKNAME_MAX 16 typedef struct { char name[NICKNAME_MAX]; int len; } UserName; // 注册时处理昵称 bool RegisterUser(UserName *user, const char *input) { if (strlen(input) >= NICKNAME_MAX) { // 截断并提示用户 strncpy(user->name, input, NICKNAME_MAX - 1); user->name[NICKNAME_MAX - 1] = '\0'; user->len = NICKNAME_MAX - 1; return false; } strcpy(user->name, input); user->len = strlen(input); return true; }
#define
常量,避免初始化开销length
,省去单独字段(但会减少实际可用空间)本文由 业务大全 于2025-08-14发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/614385.html
发表评论