C语言-动态内存管理

更灵活的内存管理方式

malloc

-申请动态内存空间

函数原型:

-void *malloc(size_t size);

malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针。

如果函数调用成功,返回一个指向申请的内存空间的指针,由于返回类型是void指针(void*),所以它可以被转换成任何类型的数据;如果函数调用失败,返回值是NULL。另外,如果size参数设置为0,返回值也可能是NULL,但这并不意味着函数调用失败。

#include <stdio.h>

int main()
{
    int *ptr;
    ptr = (int *)malloc(sizeof(int));
    if (ptr == NULL)
    {
        printf("分配内存失败!\n");
        exit(1);
    }

    printf("请输入一个整数:");
    scanf("%d", ptr);

    printf("你输入的整数是:%d\n",*ptr);

    return 0;
}

free

-释放动态内存空间

函数原型:

-void free(void *ptr);

free函数释放Ptr参数指向的内存空间。该内存空间必须是由malloc,calloc或realloc函数申请的。否则,该函数将导致未定义行为。如果ptr参数是NULL,则不执行任何操作。注意:该函数并不会修改ptr参数的值,所以调用后它仍然指向原来的地方(变为非法空间)。

#include <stdio.h>

int main()
{
    int *ptr;
    ptr = (int *)malloc(sizeof(int));
    if (ptr == NULL)
    {
        printf("分配内存失败!\n");
        exit(1);
    }

    printf("请输入一个整数:");
    scanf("%d", ptr);

    printf("你输入的整数是:%d\n",*ptr);
    free(ptr);
    printf("你输入的整数是:%d\n",*ptr);


    return 0;
}

calloc

-申请并初始化一系列的内存空间

realloc

-重新分配内存空间

内存泄漏

如果申请的动态内存没有及时释放会怎么样

总结一下,导致内存泄漏主要原因有两种情况:

-隐式内存泄漏(即用完内存块没有及时使用free函数释放)

-丢失内存块地址

malloc

malloc还可以申请一块任意尺寸的内存空间

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *ptr=NULL;
    int num, i;
    printf("请输入待录入整数的个数:");
    scanf("%d", &num);
    ptr = (int*)malloc(num*sizeof(int));
    for (i=0;i<num; i++)
    {
        printf("请录入第%d个整数:",i+1);
        scanf("%d",&ptr[i]);
    }
    printf("你录入的整数是:\n");
    for (i=0;i<num;i++)
    {
        printf("%d\n",ptr[i]);
    }
    
    free(ptr);
    return 0;
}

初始化内存空间

以men开头的函数被编入字符串标准库,函数的声明包含在string.h这个头文件中:

-memset -- 使用一个常量字节填充内存空间

-memcpy -- 拷贝内存空间

-memmove -- 

-memcmp -- 比较内存空间

- memchr -- 在内存空间中搜索一个字符

calloc

函数原型:

-void *calloc(size_t nmemb, size_t size);

calloc函数在内存中动态的申请nmemb个长度为size的连续内存空间(即申请的总内存空间尺寸为nmemb *size),这些内存空间全部被初始化为0。

calloc函数与malloc函数的一个重要区别是:

-calloc函数在申请完内存后,自动初始化该内存空间为零

-malloc函数不进行初始化操作,里边数据是随机的

下边两种写法是等价的:

//calloc()分配内存空间并初始化

int *ptr = (int *)calloc(8,sizeof(int));

//malloc() 分配内存空间并用memset()初始化

int *ptr = (int *)malloc(8*sizeof(int));

memset(ptr, 0,8*sizeof(int));

realloc

函数原型:

-void *realloc(void *ptr, size_t size);

以下几点时需要注意的:

-realloc函数修改ptr指向的内存空间大小为size字节

-如果新分配的内存空间比原来的大,则就内存块的数据不会发生改变;如果新的内存空间大小小于旧的内存空间,可能会导致数据丢失,慎用!

-该函数将移动内存空间的数据并返回新的指针

-如果ptr参数为NULL,那么调用该函数就相当于调用malloc(size)

-如果size参数为0,并且ptr参数不为NULL,那么调用该函数就相当于调用free(ptr)

-除非ptr参数为NULL,否则ptr的值必须由先前调用malloc,calloc或realloc函数返回

内容概要:本文详细介绍了如何利用Simulink进行自动代码生成,在STM32平台上实现带57次谐波抑制功能的霍尔场定向控制(FOC)。首先,文章讲解了所需的软件环境准备,包括MATLAB/Simulink及其硬件支持包的安装。接着,阐述了构建永磁同步电机(PMSM)霍尔FOC控制模型的具体步骤,涵盖电机模型、坐标变换模块(如Clark和Park变换)、PI调节器、SVPWM模块以及用于抑制特定谐波的陷波器的设计。随后,描述了硬件目标配置、代码生成过程中的注意事项,以及生成后的C代码结构。此外,还讨论了霍尔传感器的位置估算、谐波补偿器的实现细节、ADC配置技巧、PWM死区时间和换相逻辑的优化。最后,分享了一些实用的工程集成经验,并推荐了几篇有助于深入了解相关技术和优化控制效果的研究论文。 适合人群:从事电机控制系统开发的技术人员,尤其是那些希望掌握基于Simulink的自动代码生成技术,以提高开发效率和控制精度的专业人士。 使用场景及目标:适用于需要精确控制永磁同步电机的应用场合,特别是在面对高次谐波干扰导致的电流波形失真问题时。通过采用文中提供的解决方案,可以显著改善系统的稳定性和性能,降低噪声水平,提升用户体验。 其他说明:文中不仅提供了详细的理论解释和技术指导,还包括了许多实践经验教训,如霍尔传感器处理、谐波抑制策略的选择、代码生成配置等方面的实际案例。这对于初学者来说是非常宝贵的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值