结构体地址对齐问题
int + char + float = 9 但是这里数据大小却是12,这是地址对齐的基因,分析如图
可以不让他对其,这样就成9个了,按地址挨个存
2
#include <stdio.h>
#include <stdlib.h>
struct dataA
{
int A;
char s1;
float B;
}__attribute__((packed));
void fun(struct dataA *c)
{
printf("%zu\n",sizeof(&c));
}
int main(int argc,char *argv[])
{
struct dataA Q;
struct dataA *p = &Q;
fun(p);
printf("%zu\n",sizeof(Q));
return 0;
}
union
位域
#include <stdio.h>
#include <stdlib.h>
union
{
struct
{
unsigned char a:1;
unsigned char b:1;
unsigned char c:1;
unsigned char d:2;
}bit;
unsigned char y;
}va;
int main()
{
va.y = 0x37; //0011 0111
printf("data = %u\n",va.y);
printf("data = %u\n",va.bit.a); // 1
printf("data = %u\n",va.bit.b); // 1
printf("data = %u\n",va.bit.d); //1 0
return 0;
}
结果
动态内存管理
malloc ralloc realloc free
原则 :谁申请谁释放
1,动态数组的实现
2, 内存泄漏分析
这里传入func的是空指针,里面申请了,但是里面p和外面的不是同一个,free的还是free(NULL)
更改方法1(二级指针传参)
更改方法2 指针函数
注意点2
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = NULL;
p = malloc(sizeof(int));
if(p == NULL)
printf("malloc_error");
else
{
*p = 10;
printf("%d\n",*p);
printf("1-->%p\n",p);
}
free(p); //这里释放后p就是野指针了,不能再调用p
*p = 123;
printf("2-->%p\n",p);
printf("%d\n",*p);
return 0;
}
free释放后虽然还能调用,但是已经是野指针了
根据编译器的不同,free后的p地址不同,这里虽然地址没变但他还是野指针,建议free后立马把指针写成空,
typedef重定义
与宏定义区别
2
#include <stdio.h>
#include <stdlib.h>
typedef int arr[6];
arr a = {1,2,3,4,5,6};
int main()
{
for(int i = 0;i<=5;i++)
printf("%d\n",a[i]);
return 0;
}
结果
2,各种写法