DevSupportC语言C语言

C语言内存管理一本道来

2017-12-06  本文已影响49人  PcDack

动态内存分配



我们需要动态内存分配的原因

! 需求

程序运行的过程中,可能需要使用一些额外的内存空间

malloc和free

动态内存分配.png

注意

calloc和realloc


程序的三个要素

后进先出

栈.png

tips:不能将一个指针指向一个局部变量

堆内存需要主动申请

程序的静态存储区

小结


程序的内存布局

程序文件的一般布局

程序文件的一般布局.png

程序的内存布局(运行的时候,由操作系统分配)

内存布局.png

各个段的作用

.bss和.data段就是所谓的静态存储区

小结


头疼的野指针(了解野指针)

C语言中没有方法可以判断是否为野指针

野指针的由来

最佳示例 例子1

#include <stdio.h>
#include <string.h>

struct Student
{
    char* name;
    int number;
};

int main()
{
    struct Student s;
    strcpy(s.name, "Delphi Tang"); // OOPS!
    s.number = 99;
    return 0;
}

最佳示例 例子2

#include <stdio.h>
#include <malloc.h>
#include <string.h>

void func(char* p)
{
    printf("%s\n", p);
    free(p);
}

int main()
{
    char* s = (char*)malloc(5);
    strcpy(s, "Delphi Tang");
    func(s);
    printf("%s\n", s); // OOPS!
    return 0;
}

最佳示例

#include <stdio.h>
char* func()
{
    char p[] = "Delphi Tang";
    return p;
}

int main()
{
    char* s = func();
    printf("%s\n", s); // OOPS!
    return 0;
}

经典的错误(4野指针)

非法内存操作分析

例子

#include<stdio.h>
#include<malloc.h>
struct Demo
{
    int * p;
};
void main()
{
    struct Dome d1;
    struct Dome d2;
    int i=0;
    for(i=0;i<10;i++)                     //问题1:不能直接赋值,因为并没有分配内存,也没有初始化。
    {
        d1.p[i]=i+1;
    }
    free(d2.p);
    d2.p=(int *)calloc(5,sizeof(int));
    for(i=0;i<10;i++)                    //问题2:只分配了5个空间,却用了10个。
    {
        d2.p[i]=i+1;
    }
    free(d2.p);
    return 0;
}

内存初始化分析

#include<stdio.h>
#include<malloc.h>
void main()
{
    char* s=(char*)malloc(5);//不一定是 \0结束,所以不是字符串。没办法输出
    //s[4]='\0';
    printf(s);
    free(S);
}

内存越界

void f(int a[10])
{
    int i=0;
    for(i=0;i<10;i++)
    {
        a[i]=i;
        printf("%d\n",a[i]);
    }
}
int main()
{
    int a[5];
    f(a);
    return 0;
}

内存泄漏分析

#include <stdio.h>
#include <malloc.h>

void f(unsigned int size)
{
    int* p = (int*)malloc(size*sizeof(int));
    int i = 0;
    if( size % 2 != 0 )
    {
        return; // OOPS!需要free掉,基数个size的情况
    }
    for(i=0; i<size; i++)
    {
        p[i] = i;
        printf("%d\n", p[i]);
    }
    free(p);
}

int main()
{
    f(9);
    f(10);
    return 0;
}

C语言有关内存的规则

用malloc申请了内存之后,应该立即检查指针值是否为NULL,防止使用值为NULL的指针

int *p=(int *)malloc(5*sizeof(int));
if(p!=NULL)
{

}
free(p);

牢记数组长度,防止数组越界操作,考虑使用柔性数组

上一篇 下一篇

猜你喜欢

热点阅读