C语言结构体深度解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: C语言结构体深度解析

    做了挺久的开发,对于C这种东西,我不敢说自己已经精通了,毕竟还是有许多细节在学习的过程中会遗忘,然后再通过实践慢慢去一点点捡回来。所以只能算是熟练级别。


    Linux内核的实现博大精深,它大部分都是由C语言实现的,从offsetof的实现到后面的container_of,为什么通过结构体的的成员就能获得整个结构体的指针呢?这就得益于offsetof宏的实现。关于这个宏,前面的博文也有讲解,但不够深入,今天的这个例子,足以对结构体本身的原理大彻大悟,我们来看下面这个例子:

#include <stdio.h>
//32位系统上,结构体在没指定对齐的时候,默认以四字节进行对齐 
typedef struct __ST
{
int id ; //4
char *name ; //4
float math ;//4
}ST;
int main()
{
ST st ;
//获取结构体的第一个元素的首地址 
int *ptr_0 = (int *)(&st);
printf("st:   %p    ptr:   %p \n",&st,ptr_0);
//对结构体第一个元素赋值 
*ptr_0 = 100 ;
printf("*ptr_0 = %d\n",*ptr_0);
//获取结构体的第二个元素的首地址,因为第二个元素是一级指针,所以需要用一个二级指针来接 
char **ptr_1 = (char **)((int)&st+4) ;
printf("ptr_1:%p\n",ptr_1);
//对结构体的第二个元素赋值 
*ptr_1 = "hello world";
printf("ptr_1:%s\n",*ptr_1);
//获取结构体的第三个元素的首地址,根据对齐原则偏移算出第三个元素的地址 
float *ptr_2 = (float *)((int)&st+8) ;
printf("ptr_2:%p \n",ptr_2);
//对结构体的第三个元素进行赋值 
*ptr_2 = 96.78 ;
printf("ptr_2:%.2f \n",*ptr_2);
//输出结构体中所有成员的值 
printf("st.id = %d   st.name = %s   st.math =%.2f\n",st.id,st.name,st.math);
    return 0;
}

      这里的根据对齐原则算出来的偏移量其实其实不就是offsetof宏的原理吗?

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)


      往后继续看待链表,函数指针,等等与结构体有关的概念,瞬间觉得一幕了然,彻底打通了这条曾经学习的阻塞道路。

目录
相关文章
|
23天前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
30 10
|
22天前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
27天前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
27天前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
1月前
|
编译器 C语言 C++
C语言结构体
C语言结构体
25 5
|
1月前
|
编译器 Linux C语言
C语言 之 结构体超详细总结
C语言 之 结构体超详细总结
19 0
|
1月前
|
存储 编译器 Linux
深入C语言:探索结构体的奥秘
深入C语言:探索结构体的奥秘
|
1月前
|
存储 编译器 C语言
c语言回顾-结构体(2)(下)
c语言回顾-结构体(2)(下)
28 0
|
1月前
|
存储 编译器 程序员
c语言回顾-结构体(2)(上)
c语言回顾-结构体(2)(上)
28 0
|
1月前
|
存储 C语言
c语言回顾-结构体
c语言回顾-结构体
16 0

推荐镜像

更多