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;
- }
复制代码
|