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

相关文章

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自