【C语言】C tips

本文讨论了C语言编译时关于将整数转换为指针和指针转换为整数时的大小不匹配警告,并提供了使用`intptr_t`来消除这些警告的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. How to solve warning: cast to pointer from integer of different size and vice versa:

#include <stdio.h>

int main() {
    void *p = NULL;
    int a = 3;
    p = (void *)a;
    a = (int)p;

    printf("%ld\n", p);
    printf("%ld\n", a);

    return 0;
}

The above code has the following warnings when compiling: 

/tmp/0pubXc3fmS.c: In function 'main':
/tmp/0pubXc3fmS.c:7:9: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
    7 |     p = (void *)a;
      |         ^
/tmp/0pubXc3fmS.c:8:9: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
    8 |     a = (int)p;
      |         ^
/tmp/0pubXc3fmS.o

Converting pointer/data to (unsigned) long before casting to required data types can eliminate this warning: (intptr_t works the same)

#include <stdio.h>

int main() {
    void *p = NULL;
    int a = 3;
    p = (void *)(long)a;
    a = (int)(long)p;

    printf("%ld\n", p);
    printf("%ld\n", a);

    return 0;
}

2. Access to anonymous union in a struct

If a union in a structure that has no name, you can directly access the fields in the union without the union name:

#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>

struct ifreq {
	union {
		short ifru_flags;
		int	ifru_ivalue;
		int	ifru_mtu;
	};
	union {
		short ifru_flags2;
		int	aaa;
		int	bbb;
	};
};

int main()
{
    printf("%d\n", sizeof(struct ifreq));
	
    struct ifreq ifr = {0};
    printf("ifr.ifru_flags:%.4X\n", ifr.ifru_flags);

    ifr.ifru_flags = 0x55A5;
    ifr.ifru_flags2 = 0x3344;
    ifr.aaa = 0xAABBCCDD;

    printf("ifr.ifru_flags:%.4X\n", ifr.ifru_flags);
    printf("ifr.ifru_flags2:%.4X\n", ifr.ifru_flags2);
    dg_frame_dump((uint8_t *)&ifr, sizeof(ifr));

   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值