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;
}