Linux C编程——结构体操作注意事项(深拷贝、偏移量)

2024-06-03 22:18

本文主要是介绍Linux C编程——结构体操作注意事项(深拷贝、偏移量),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在结构体中,需要考虑的有:

  1.  内存对齐,下面例子可以看到;
  2. 结构体含一级、二级指针,有深拷贝和浅拷贝之分;
  3. s.i和s->i是计算偏移量,在CPU中计算,不会操作内存。

有一个宏 offoset 可以计算结构体成员偏移:

SYNOPSIS#include <stddef.h>size_t offsetof(type, member);DESCRIPTIONThe macro offsetof() returns the offset of the field member from the start of the structure type.This macro is useful because the sizes of the fields that compose a structure can vary across implementa‐tions, and compilers may insert different numbers of padding bytes between fields.  Consequently, an ele‐ment's offset is not necessarily given by the sum of the sizes of the previous elements.A compiler error will result if member is not aligned to a byte boundary (i.e., it is a bit field).RETURN VALUEoffsetof() returns the offset of the given member within the given type, in units of bytes.
./include/linux/stddef.h文件中有如下定义。00020: #undef offsetof
00021: #ifdef  compiler_offsetof
00022: #define offsetof(TYPE,MEMBER)  compiler_offsetof(TYPE,MEMBER)
00023: #else
00024: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
00025: #endif
00026: #endif /* KERNEL  */
00027:
00028: #endif
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>int
main(void)
{struct s {int i;char c;double d;char a[];};/* Output is compiler dependent */printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",(long) offsetof(struct s, i),(long) offsetof(struct s, c),(long) offsetof(struct s, d),(long) offsetof(struct s, a));printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));exit(EXIT_SUCCESS);
}
[root@localhost apue]# ./a.out 
offsets: i=0; c=4; d=8 a=16
sizeof(struct s)=16

 

这篇关于Linux C编程——结构体操作注意事项(深拷贝、偏移量)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028268

相关文章

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3