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

news2025/1/21 3:01:45

        今天无意间看到这样一段代码,因为还是第一次看到,这是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.coloradmin.cn/o/1495882.html

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

相关文章

职场中的团队合作与个人成长

在职场中&#xff0c;团队合作和个人成长是两个不可或缺的要素。一个优秀的团队可以带来更高的工作效率和更好的业绩&#xff0c;而个人的成长则是职场成功的关键。本文将探讨如何在职场中实现团队合作与个人成长的平衡。 一、团队合作的重要性 在职场中&#xff0c;团队合作是…

授权认证登录之 Cookie、Session、Token、JWT 详解

授权认证登录之 Cookie、Session、Token、JWT 详解 一、先了解几个基础概念什么是认证&#xff08;Authentication&#xff09;什么是授权&#xff08;Authorization&#xff09;什么是凭证&#xff08;Credentials&#xff09; 二、Cookie1、了解 Cookie2、cooker的创建2、coo…

【数据结构】队列 循环队列 双端队列——顺序队列+链式队列完整代码(创建、入队、出队)

2.队列 2.1 队列的定义 定义 只允许在一端进行插入&#xff0c;另一端删除的线性表。 特征&#xff1a;先进先出&#xff08;First In First Out->FIFO&#xff09; 重要术语&#xff1a;队头、队尾、空队列 2.2 队列的顺序存储 2.2.1 初始化 结构体 typedef struct{…

数字人民币钱包(二)

文章目录 前言一 什么是数字人民币钱包&#xff1f;二 怎么开通数字人民币钱包&#xff1f;三 数字人民币钱包有哪些&#xff1f;四 数字人民币钱包升级 前言 上篇文章梳理了什么是数字人民币&#xff0c;及其特征和相关概念&#xff0c;这篇文章来整理下数字人民币钱包。数字人…

TOMCAT多实例及调优

一、JVM相关理论 &#xff08;一&#xff09;JVM组成 1.JVM组成部分 类加载子系统: 使用Java语言编写.java Source Code文件&#xff0c;通过javac编译成.class Byte Code文件。class loader类加载器将所需所有类加载到内存&#xff0c;必要时将类实例化成实例 运行时数据区…

1908_Arm Cortex-M3的实现

1908_Arm Cortex-M3的实现 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) 这是第一次看一份这样的手册&#xff0c;之前的MCU编程基本上就是专注于软件接口方面。而OS等方面的一些功能基本上都是用了现成的解决方案&#xff0c;因此也就没有过多的关注…

NXP iMX8MM Cortex-M4 核心 GPT Capture 测试

By Toradex秦海 1). 简介 NXP i.MX8 系列处理器均为异构多核架构 SoC&#xff0c;除了可以运行 Linux 等复杂操作系统的 Cortax-A 核心&#xff0c;还包含了可以运行实时操作系统比如 FreeRTOS 的 Cortex-M 核心&#xff0c;本文就演示通过 NXP i.MX8MM 处理器集成的 Cortex-…

基于Springboot+Layui餐厅点餐系统

一、项目背景 在互联网经济飞速发展的时代&#xff0c;网络化企业管理也在其带领下快速兴起&#xff0c;开发一款自主点餐系统会受到众多商家的青睐。现如今市场上的人力资源价格是非常高昂的&#xff0c;一款自主点餐系统可以减少餐厅的人力开销&#xff0c;将服务员从繁忙的…

建立自己的富足金字塔

本文的理论参考&#xff1a; 1、《金字塔原理》&#xff0c;可以简述为&#xff1a;上下层互为支撑的结构化表达&#xff0c;通常为1-3-9结构&#xff1b;完全穷举、互不交叉&#xff0c;或不重不漏MECE的分门分类&#xff1b;真实有效&#xff0c;真知灼见。 2、《金线》在金字…

贷齐乐错误的waf引起的SQL注入漏洞复现

君衍. 一、环境介绍1、第一道WAF2、第二道WAF 二、环境部署1、模拟源码2、连接数据库源码3、数据库创建4、测试 三、源码分析1、模拟WAF2、注入思路3、PHP下划线特性4、完成假设 四、联合查询注入1、测试回显字段2、爆出库名3、爆出表名4、爆出表下的列名4、爆出flag 一、环境介…

AI大模型与小模型之间的“脱胎”与“反哺”(第五篇)

一、背景 AI大模型与小模型之间存在一种“脱胎”与“反哺”的关系&#xff0c;这种关系在AI技术的发展中起到了重要的作用。 首先&#xff0c;我们来理解一下“脱胎”的概念。在AI领域&#xff0c;大模型通常具有更大的参数量、更强的表达能力和更高的计算需求。这些大模型通…

第一个 Angular 项目 - 添加路由

第一个 Angular 项目 - 添加路由 前置项目是 第一个 Angular 项目 - 添加服务&#xff0c;之前的切换页面使用的是 ngIf 对渲染的组件进行判断&#xff0c;从而完成渲染。这一步的打算是添加路由&#xff0c;同时添加 edit recipe 的功能(同样通过路由实现) 用到的内容为&…

RabbitMQ 交换器

RabbitMQ 交换器 官方例子 http://www.rabbitmq.com/getstarted.html direct 如上图所示&#xff0c;两个队列绑定到了direct交换器上&#xff0c;第一个队列绑定的 binding key 为 orange &#xff0c;第二个队列有两个绑定&#xff0c;分别是 black 和 green 。 如上图所示…

vue+element模仿实现云码自动验证码识别平台官网

一、项目介绍 项目使用传统vue项目结构实现&#xff0c;前端采用element实现。 element官网&#xff1a;Element - The worlds most popular Vue UI framework 云码官网地址&#xff1a;云码-自动验证码识别平台_验证码识别API接口_免费验证码软件 项目截图&#xff0c;支持…

一键安装conda-batch脚本

conda的安装可以更简化些&#xff0c;即使用batch文件&#xff0c;具体步骤如下&#xff1a; 新建文本文档&#xff0c;并改后缀名为.bat 使用文本编辑器编辑&#xff0c;并输入内容如下 echo offSET MINICONDA_INSTALLER_PATHminiconda3_installer.exe SET MINICONDA_UR…

实现一个网页版的简易猜数字游戏

实现一个网页版的简易猜数字游戏 效果 代码截图 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

基于Matlab实现免疫荧光图像中的区域定位算法

基于Matlab实现免疫荧光图像中的区域定位算法 免疫荧光法。以荧光染料为标记物,试纸条为载体,发生抗原抗体特异性反应,根据免疫复合物被激发的荧光强度对待测物进行定量分析[。该方法具有环境要求不高、操作简单快速、无污染且荧光染料丰富等优点。 常用于食品安全检测过程中…

Python实现选择排序算法

Python实现选择排序算法 以下是使用Python实现选择排序算法的示例代码&#xff1a; def selection_sort(arr):n len(arr)for i in range(n):min_index i# 找到未排序部分的最小元素的索引for j in range(i 1, n):if arr[j] < arr[min_index]:min_index j# 将最小元素与…

【BUG】cmd运行wmic提示‘wmic‘ 不是内部或外部命令

cmd运行wmic提示‘wmic‘ 不是内部或外部命令 解决办法 将C:\Windows\System32\wbem添加到系统环境变量

《系统架构设计师教程(第2版)》第6章-据库设计基础知识-01-数据库基本概念

文章目录 1. 概述1.1 基本概念1&#xff09;信息 (Information)2&#xff09;数据 (Data)3&#xff09;数据库 (DB)4&#xff09;数据库系统(DBS)5&#xff09;数据库管理系统&#xff08;DBMS&#xff09; 1.2 数据库技术的发展1.2.1 人工管理阶段1.2.2 文件系统阶段1&#xf…