指针数组初始化,不常见啊

        今天无意间看到这样一段代码,因为还是第一次看到,这是glibc库里的代码,写出来分享一下:

#ifndef ERR_MAP
# define ERR_MAP(n) n
#endif
const char *const _sys_errlist_internal[] ={
#define _S(n, str)         [ERR_MAP(n)] = str,
#include <errlist.h>
#undef _S};

        这里很明显定义了一个指针数组,也就是首先 _sys_errlist_internal 是一个数组,并且这个数组里元素都是指针,所以它是一个指针数组毫无疑问。这里比较奇怪的是初始化方式,即 [n] = str。一般我们指针数组是这样初始化的:

const char *const errlist_internal[] = 
{"Operation not premitted","No such file or directry","I/O error"
};

        而像这样的初始化方式也是合法的,可能 C 语言所有类型的数组都支持这样初始化:

const char *const errlist_internal[] = 
{[0] = "Operation not premitted",[2] = "No such file or directry",[5] = "I/O error"
};

 因为没有指定数组大小,所以这样初始化数组大小是多少呢?从 C 语言数组类型知识点我们应该能猜出来,数组大小应该是 6,即包含 6 个元素。

#include <stdio.h>
#include <stdlib.h>const char *const errlist_internal[] = 
{[0] = "Operation not premitted",[2] = "No such file or directry",[5] = "I/O error"
};int main()
{size_t num = sizeof(errlist_internal)/sizeof(errlist_internal[0]);printf("number of list is %lu\n", num);size_t i =  0;for(; i < num; i++){printf("errlist_internal[%lu] = %s\n", i, errlist_internal[i]);}return 0;
}

所以这种初始化方式应该是指定元素的初始化方式,未初始化到的元素是空的(指针类型时是null,其他类型未验证)。 所以像 glibc 库里这个代码,预编译出来应该类似这样的:

#include <stdio.h>
#include <stdlib.h>#ifndef ERR_MAP
# define ERR_MAP(n) n
#endif
const char *const _sys_errlist_internal[] ={
#define _S(n, str)         [ERR_MAP(n)] = str,
#include "errlist.h"
#undef _S};int main()
{size_t num = sizeof(_sys_errlist_internal)/sizeof(_sys_errlist_internal[0]);printf("number of list is %lu\n", num);size_t i =  0;for(; i < num; i++){printf("_sys_errlist_internal[%lu] = %s\n", i, _sys_errlist_internal[i]);}return 0;
}

errlist.h

_S(1, "Operation not permitted")
_S(2, "No such file or directory")

预编译出来是这样的:

在 errlist.h 头文件里使用了宏定义,然后完成对指针数组的初始化。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/724612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebGIS开发0基础必看教程:矢量查询

1.前言 在第七章里我们知道了WebGIS中要素的本质是UIComponent&#xff0c;而矢量图层的本质是包含了n&#xff08;n>0&#xff09;个UIComponent的Canvas。我们在UIComponent的graphics中&#xff0c;根据矢量数据画出矢量的形状(shape)&#xff0c;并且将矢量数据的属性(…

WordPress建站入门教程:小皮面板phpstudy如何安装PHP和切换php版本?

小皮面板phpstudy支持的PHP版本有很多&#xff0c;包括5.2.17、5.3.29、5.4.45、5.5.9、5.6.9、7.0.9、7.1.9、7.2.9、7.3.4、7.3.9、7.4.3、8.0.2、8.2.9。那么我们如何安装其他的php版本和切换网站的php版本呢&#xff1f;只需要简单几步即可&#xff0c;具体如下&#xff1a…

第十一篇 - 应用于市场营销视频场景中的人工智能和机器学习技术 – Video --- 我为什么要翻译介绍美国人工智能科技巨头IAB公司?

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

【工作向】protobuf编译生成pb.cc和pb.py文件

序言 首先通过protoc --version查看protoc版本&#xff0c;避免pb文件生成方和使用方版本不一致 1. 生成pb.cc 生成命令 protoc -I${proto_file_dir} --cpp_out${pb_file_dir} *.proto参数&#xff1a; -I表示 proto 文件的路径&#xff1b; --cpp_out 表示输出路径&#xff…

被问爆了!多微信朋友圈一键转发大揭秘!

对于很多企业和个人而言&#xff0c;朋友圈是一个非常重要的营销渠道。不仅可以吸引潜在客户的关注&#xff0c;还能提高产品和服务的曝光率。 今天&#xff0c;就给大家分享一个能够多个微信号一键转发朋友圈的工具——微信管理系统&#xff0c;帮助大家提高工作效率&#xf…

2024年 Python面试热点

当然&#xff0c;以下是一些Python相关的热点面试题&#xff1a; 请解释一下Python中的装饰器&#xff08;Decorators&#xff09;是什么&#xff0c;以及它们的主要用途是什么&#xff1f; 装饰器是Python中的一个高级功能&#xff0c;它允许用户修改或增强函数、方法或类的行…

网工内推 | 华为成都研究所,24届应届生人才储备计划

华为成都研究所 招聘岗位 网络工程师&#xff08;2024应届&#xff09; 岗位要求 24届的学员 本科公办院校 英语4/6级 有HCIP优先 工作地点 成都 私信小编&#xff0c;回复【内推】&#xff0c;获取内推名额申请资格~ 想获取更多『 思科 | 华为 | 红帽 认证真题 』、『 网…

jdk安装,配置path系统变量

直接点击安装 不要包含空格&#xff0c;中文字符 3.找到刚刚的路径&#xff0c;看一下&#xff0c;有东西就说明安装对了 配置path winr输入sysdm.cpl点击确定 全部依次点击 确定 即可。 验证jdk是否安装成功 看java、javac是否可用看java、javac版本号是否无问题 win…

EasyUI DataGrid在updateRow会重新渲染该行,导致绑定的事件失效

因为在更新行数据时&#xff0c;EasyUI DataGrid 会重新渲染该行&#xff0c;导致之前绑定的事件失效。这是因为当您调用 updateRow 方法后&#xff0c;DataGrid 会重新生成该行的 HTML&#xff0c;而原有的事件绑定只作用于旧的 HTML 元素上。 为了解决这个问题&#xff0c;您…

FlyClient SPV client轻量化

这篇文章主要是为了构建一种轻客户端的算法。 如果使用SPV 的方式验证交易&#xff0c;每个client上面需要存储非常多的header。使用 proofs of proof-of-work 的方式&#xff0c;使得请客户端仅仅下载少量的区块头就能验证这一条链的安全性&#xff0c;然后再对包含交易的区块…

Linux脚本语言学习

第一章Linux学习方式 1.1.1 Linux中的大小写和英文输入法 在Linux中除了大小写之外&#xff0c;需要关注的就是输入法的中文和英文状态&#xff0c;在使用linux的过程中如果不小心在中文状态下输入中文的空格&#xff0c;或者是在网络上拷贝他人的脚本发现运行后出现错误的信…

华为机试 字符串最后一个单词的长度

本题中&#xff0c;我们是要从键盘输入一个字符串&#xff0c;然后返回这个字符串最后一个单词的长度。所以我们需要scancer类。我们需要注意的是&#xff0c;hasnext()和hasnextline()这两个函数的区别。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 pack…

内存函数详解

1. memcpy函数 void * memcpy ( void * destination, const void * source, size_t num ); 1.1 函数的功能&#xff0c;使用与注意事项 1. memcpy函数的作用是内存拷贝&#xff0c;即将source指向的空间中的num个字节拷贝到destination指向的空间中去&#xff0c;然后返回de…

力扣hot---岛屿数量

思路dfs&#xff1a; 首先通过两层for循环遍历每一个点&#xff0c;如果这个点为0或者2&#xff08;这个2是什么呢&#xff1f;是在遍历该点以及该点连成的这一片区域中&#xff0c;因为通过深度优先搜索&#xff0c;遍历该点就等于遍历这一片区域&#xff0c;遍历这篇区域中的…

玩家至上:竞技游戏设计如何满足现代玩家的需求?

文章目录 一、现代玩家需求分析二、以玩家体验为核心的游戏设计三、个性化与定制化服务四、强化社交互动与社区建设五、持续更新与优化《游戏力&#xff1a;竞技游戏设计实战教程》亮点编辑推荐内容简介目录获取方式 随着科技的飞速发展和游戏产业的不断壮大&#xff0c;现代玩…

通讯协议----USB2.0协议

USB2.0协议 USB总线的信号常见信号数据编解码和位填充 USB设备的检测USB设备的挂起USB传输PacketPacket包种类Data PID作用 TransactionTransfer控制传输(Control Transfers):中断传输(Interrupt Transfers)同步传输(Isochronous Transfers)大容量数据传输(Bulk Transfers)控制…

安装QT时,安装进程(qt.tools.perl)运行期间出现错误

安装QT时&#xff0c;安装进程(qt.tools.perl)运行期间出现错误 解决方法

【MySQL】数据库的操作(1)

【MySQL】数据库的操作&#xff08;1&#xff09; 目录 【MySQL】数据库的操作&#xff08;1&#xff09;创建数据库数据库的编码集和校验集查看系统默认字符集以及校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响数据库的删除 数据库的备…

对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置?

在Java中&#xff0c;对象实例、类信息、常量、静态变量在运行时数据区的位置如下&#xff1a; 对象实例&#xff08;Object Instance&#xff09;&#xff1a;对象实例通常存储在堆&#xff08;Heap&#xff09;中。堆是用于存储动态分配的对象的内存区域&#xff0c;每个对象…

TypeScript 之 介绍和入门

TypeScript简介 它是由微软开发的自由和开源的编程语言&#xff0c; 属于静态编程语言&#xff0c;在编写的时候会直接检测错误。 它是JavaScript的超集&#xff0c; TypeScript需要通过编译器将其编译生成为JavaScript文件才能运行&#xff0c;因此该语言的运行要比JavaScrip…