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

 

 

相关推荐

  1. C语言-动态内存分配

    2024-03-31 23:10:02       55 阅读
  2. C语言深入学习 --- 5.动态内存管理

    2024-03-31 23:10:02       39 阅读
  3. C语言】(20)动态内存分配

    2024-03-31 23:10:02       51 阅读
  4. C# 学习笔记-构造自己的类型

    2024-03-31 23:10:02       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 23:10:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 23:10:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 23:10:02       82 阅读
  4. Python语言-面向对象

    2024-03-31 23:10:02       91 阅读

热门阅读

  1. C语言刷题(21)

    2024-03-31 23:10:02       39 阅读
  2. 算法刷题day37

    2024-03-31 23:10:02       38 阅读
  3. 优化代码分支

    2024-03-31 23:10:02       46 阅读
  4. c语言:把百分制转化为等级制度(switch语句)

    2024-03-31 23:10:02       46 阅读
  5. 搭建语音打电话机器人需要哪些技术和资源

    2024-03-31 23:10:02       47 阅读
  6. 座次问题(蓝桥杯)

    2024-03-31 23:10:02       40 阅读
  7. css页面搭建案例

    2024-03-31 23:10:02       34 阅读
  8. 输入 wo xiang he ni jao peng you.,倒着打。

    2024-03-31 23:10:02       44 阅读
  9. NC20128 不重复数字

    2024-03-31 23:10:02       39 阅读