前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言(零长数组)

C语言(零长数组)

作者头像
用户2617681
发布2019-08-08 10:33:15
1.3K0
发布2019-08-08 10:33:15
举报
文章被收录于专栏:秘籍酷秘籍酷

经常有同学会问:C语言怎样根据实际的输入,来决定一个数组究竟要多大?也就是实现一个能自动适应我需求的“智能”数组,答案是:很遗憾!C语言没有这么高级的玩意儿。但这个需求又是如此的平常,怎么破?

现在,假设你要将你输入的数据放置到一个数组之中,你的代码可能如下:

char s[20]; fgets(s, 20, stdin);

以上代码的弊端在于:如果我的输入超过20个字符,数组 s 放不下。 如果我的输入不足20个字符,显然是一种浪费。

当然,你可能会说,可以用变长数组呀,look:

int n; scanf("%d", &n); // 先说好你要输入的字符长度 char s[n]; // 根据说好的 n 来定义数组 s fgets(s, n, stdin);

但是这样的代码几乎没有解决任何问题,首先我们无法将输入的长度丢给用户先行决定,而是应该让程序自动判断。更何况,用户输入了n之后未必就会严格按照n个字符的长度输入后续的字符。

而且本来输入一遍的事情,现在变成要输入两遍,群众情绪可能会暴走。

来想象一个真实场景,A和B两个人通过网络对话。

网络中传输的数据包一般会包含两类信息,一类是固定的信息,比如双方的IP、端口、本包协议头等,另一类是可变信息,比如某一次聊天的具体内容。

这两类信息一般被封装在一个结构体里面,比如:

struct msg { // 一些固定长度的信息 unsigned long local_address; unsigned long peer_address; unsigned short port; .... .... // 一些长度不确定的信息 char message[0]; };

注意到,以上代码出现一个长度为 0 的数组,这个数组在GNU的新语法中被支持,它仅仅是一个占位符,也就是其本身并不占用内存,那有什么用呢?

假设结构体 struct msg 中固定长度的信息为100个字节,那么在给对方发送

一段诸如 “ 你好!” 这样的字符串的时候,可以这么分配内存:

char *package = malloc(sizeof(struct msg) + sizeof(" 你好! "));

之后,就可以将数据 " 你好!" 放入该结构体的末尾部分,然后使用数组名 message 来索引。

当然,这么做只是一个小小伎俩而已,因为你首先还是要将 “ 你好!” 这个数据存储到一个指定的固定的、并且足够大的内存空间才能。这样做只是避免了每次都需要分配一个“足够大”的数组,而变成只指定一个就可以了。

说到这里你应该是失望的,的确,C语言没有像c++那样的string类型数据,实现智能的自身可变长度的变量,毕竟,C语言不是现代自动机枪,它只是一把专注效率的尖刀。很多事情都需要开发人员参与管理和优化,系统本身没有提供更多的智能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档