C语言的一些用法总结

A. 如何根据结构体的某个成员变量地址,计算结构体的地址,也就是获取结构体的首地址
要回答这个问题之前,我们先抛出一个问题:
question:结构体的成员变量在内存中是如何分布的?
如下有一个tInstance结构体定义,那么tInstance结构体的各个成员变量在内存中是如何分布的呢?先不考虑强制对齐问题

struct A
{
    char   a; //在32位的cpu中,占1个字节
    double b; //在32位的cpu中,占8个字节
    short  c; //在32位的cpu中,占2个字节
    int    d; //在32位的cpu中,占4个字节
} tInstance;

结构体tInstance在内存中的分布如下:(未考虑大端和小端模式的问题,在我们这个问题中,也不需要考虑大端和小端的差别)
根据图可知,内存分配满足如下两个条件
(1)前一个成员变量存在低地址,后一个成员变量存在高地址
(2)每个成员变量所在的地址,是它所占字节数的整数倍
在这里插入图片描述
此时假设我们有b字段的地址,如何获取结构体的起始地址呢?显然有了b字段的地址,用b的实际地址减去b在结构体中的偏移地址,就可以获取到结构体的起始地址了,显然如下的公式是成立的:

结构体的起始地址 = b字段的实际地址 - b字段在结构体中的相对地址;

那么现在问题就转变为如何获取b字段在结构体中的相对地址,我们看下面的宏,仔细分析它的宏实现

/* ptr表示结构体中的某个成员变量的实际地址,注意这是一个指针
 * type表示结构体类型
 * member表示结构体成员变量,注意这是一个成员变量名
 */

#define container_of(ptr, type, member)		\
	(type *)((char *)ptr - (char *)&(((type *)0)->member))

因此,对于我们上面的A结构体,假设我们的成员变量b的地址是pb,那么指向这个成员变量b的结构体的指针就可以按照下面的计算方式计算(比如说结构体m_dev,我们知道它的成员变量b的地址)

struct A *pm_dev = container_of(pb, struct A, b);

B.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,printf函数是一个非常常用的输出函数,用于在控制台或终端上显示文本或变量的值。它的基本语法是: printf("格式控制字符串", 输出参数); 其中,格式控制字符串用于指定输出的格式,输出参数是要输出的具体内容。 在printf函数中,有几个常用的格式控制符可以用来输出不同类型的变量: - %d:用于输出十进制整数。例如,printf("%d", 10)会输出10。 - %f:用于输出浮点数。例如,printf("%f", 3.14)会输出3.140000。 - %s:用于输出字符串。例如,printf("%s", "hello")会输出hello。 当然,printf函数还有许多其他的格式控制符和功能,可以根据具体需求进行使用。需要注意的是,格式控制符必须与输出参数的类型匹配,否则可能导致输出结果不正确。 举个例子,假设我们有以下代码片段: #include<stdio.h> int main() { int i=1234; printf("%d\n" ,i); return 0; } 输出结果为:1234 在上述代码中,我们使用了%d格式控制符来输出整数变量i的值。 另外,如果想要在格式控制字符串中输出特殊字符(如换行符\n、制表符\t等),可以直接在字符串中添加相应的转义字符。 总结起来,printf函数是C语言中一个非常重要的输出函数,通过指定不同的格式控制符,可以输出不同类型的变量值或文本内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C 语言中printf( ) 的用法](https://blog.csdn.net/whoispp/article/details/126213504)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值