栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言学习记录——사십팔 动态内存管理(3)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言学习记录——사십팔 动态内存管理(3)

常见的动态内存错误

对NULL指针的解引用操作

#include

#include

int main()
{
    int* p = (int*)malloc(40);
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        *(p + i) = i;
    }
    free(p);
    p = NULL;
    return 0;
}

如果malloc失败了,那么p就是空指针,对空指针进行解引用操作一定不行,所以要提前有判断。

对动态开辟内存的越界访问

#include

#include

int main()
{
    int* p = (int*)malloc(5 * sizeof(int));
    if (p == NULL)
    {
        return 0;
    }
    else
    {
        int i = 0;
        for (i = 0; i < 10; i++)
        {
            *(p + i) = i;
        }
    }
    free(p);
    p = NULL;
    return 0;
}

只开辟了5个整型的空间,但是要循环10个,所以造成了越界访问

对非动态开辟空间使用free

#include

#include

int main()
{
    int a = 10;
    int* p = &a;
    *p = 20;
    free(p);
    p = NULL;
    return 0;
}

动态分配出现错误有时候会卡死。

使用free释放1动态内存的一部分

#include
#include

int main()
{
    int* p = (int*)malloc(40);
    if (p == NULL)
    {
        return 0;
    }
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        *p++ = i;
    }
    free(p);
    p = NULL;
    return 0;
}

当p逐渐增加,最后指向了最后一个元素地址,此时释放,也就是释放此时p之后的空间,这不行,会出现错误,free只能从起始位置开始释放,不能从某一点开始释放

对同一块动态内存多次释放

    free(p);
    free(p);
    p = NULL;

每次释放完都赋值空指针,再者就是写上注释

动态开辟内存忘记释放

要不内存泄露,内存一直被使用,知道被装满,电脑越来越卡。


练习

1

void GetMemory(char* p)
{
    p = (char*)malloc(100);
}

void Test(void)
{
    char* str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
}

int main()
{
    Test();
    return 0;
}

这里面有两个问题:

运行代码程序会出现崩溃的现象

程序存在内存泄漏的问题

str以值传递的形式给p

p是GetMemory函数的形参,只能函数内部有效,等此函数返回之后,动态开辟内存尚未释放并且无法找到,所以造成内存泄露

进入test函数后,str是传值方式,p相当于str的一个临时拷贝,传过去空指针后,动态开辟内存,把这块空间的首元素地址赋值给p指针,所以p也就指向了这个空间。但是这个函数没有返回值,导致开辟完后,str还是一个空指针,这时候进行拷贝相当于解引用空指针,所以程序崩溃。

要改正的话

#include

void GetMemory(char** p)
{
    *p = (char*)malloc(100);
}

void Test(void)
{
    char* str = NULL;
    GetMemory(&str);
    strcpy(str, "hello world");
    printf(str);
    free(str);
    str = NULL;
}

int main()
{
    Test();
    return 0;
}

或者

char* GetMemory(char* p)
{
    p = (char*)malloc(100);
    return p;
}

void Test(void)
{
    char* str = NULL;
    str = GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
    free(str);
    str = NULL;
}

结束。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867758.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号