C语言学习笔记(5){构造类型,动态内存分配,typedefine}

结构体地址对齐问题

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重定义

与宏定义区别

#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,各种写法

 

 

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值