堆的申请和释放

#include <stdio.h>

void func1(void);
void func2(void);
void func3(void);
void func4(void);
int main(int argc, char ** argv){

    func4();

    getchar();

    return 0;

}

/**
    malloc跟 calloc之间的区别

*/
void func4(void){

    char *p1 = NULL;
    p1 = malloc(sizeof(char)* 10);
    p1[0] = ‘a‘;
    printf(p1);
    printf("\n");
    free(p1);
    //屯屯屯屯屯葺j凹碶 。某一次的运行结果。可见如果不赋初值的话,就一定有值。
    p1 = calloc(10,sizeof(char));
    p1[0] = ‘a‘;
    printf(p1);
    free(p1);
    //这样就可以看到运行效果了。因为帮助过我们进行初始化,所以后面p1里面的每个值都是0
    //遇到0就是 文件结尾。所以 不再往下执行了

    //func4的运行效果图:


}
/**
    写一个这么大的数,就是为了提醒自己,一定要记得free掉。
*/
void func3(void){
    int *p = malloc(sizeof(int)* 1000000);//我们说了这是一个int型数组
    *p = 200;//给*p赋值,就是只给数组中的第一个元素赋了值。剩下999999个还没赋值呢,但是不代表里面没值
    //任何一块儿从内存里面要出来的空间,都有值,有可能是0,当然如果是其他程序退出剩下的,那么就什么都有可能了。
    //但通常都不是0。
    //所以用 calloc申请的内容帮我们默认设置了初值0.
    printf("p的地址%p,p的大小%d", p, *p);
    free(p);
    // 运行结果:p的地址004D0040,p的大小200

}

/**
    malloc(sizeof(int)*10)
    跟 malloc(sizeof(char)*10)
    分别代表什么怎么使用

*/
void func2(void){

    int * p = malloc(sizeof(int)* 10);//申请一个整型数组长度为10  sizeof() = 40
    p[0] = 1;
    p[1] = 2;
    p[2] = 3;
    for (int i = 0; i < 3; i++){
        printf("%d", p[i]);
    }
    free(p);

}
/**
    引入malloc

*/
void func1(void){
    char * p = malloc(sizeof(char)* 10);//申请一个char型数组,长度为10 zizeof() = 10

    strcpy(p, "nihao");

    printf(p);

    free(p);
}
时间: 2024-10-02 07:54:02

堆的申请和释放的相关文章

C++在堆上申请和释放内存 - new &amp; delete

// 动态申请内存, 指向一个未初始化的整型 int *pi = new int; // pi指向一个整型值,初始化为0 int *pi = new int(); // value of i is 1024 int i(1024); // pi指向1024 int *pi = new int(1024); // value of  s is "99999" string s(5, '9'); // *ps is "999999" string *ps = new s

/MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题

一.MD(d).MT(d)编译选项的区别 1.编译选项的位置 以VS2005为例,这样子打开: 1)         打开项目的Property Pages对话框 2)         点击左侧C/C++节 3)         点击Code Generation节 4)         右侧第六行Runtime Library项目 2.各个设置选项代表的含义 编译选项 包含 静态链接的lib 说明 /MD _MT._DLL MSVCRT.lib 多线程.Release.DLL版本的运行时库 /

堆的申请和释放2

我们说过,buf 是栈区中的一个内容. 当func1被调用. 执行Char buf[10]="nihao";的时候. Buf进栈,并被赋值. 当程序结束的时候返回了一个指向buf的地址.的同时buf出栈,里面的内容可能还在,也可能不在.但是给p的地址确实是,当初分配给他的地址.只不过现在指向了新的内容.导致我们看到了这样一个显示结果. /* 这是因为p指向的地址在那一瞬间,交付给其他程序,其他程序完成改写.再次释放了此处地址,又被p指向. 有两个否则: 第一个否则发生在,如果没有交给其

内存申请和释放及堆连续

glibc 内存申请和释放及堆连续检查 C语言有两种内存申请方式: 1.静态申请:当你声明全局或静态变量的时候,会用到静态申请内存.静态申请的内存有固定的空间大小.空间只在程序开始的时候申请一次,并且不再释放(除非程序结束). 2.自动申请:当你声明自动变量的时候会使用自动申请.函数参数.局部变量都属于自动变量.这些变量空间在程序执行致相关语句块申请,离开语句块时释放. 还有一种内存申请方式:动态内存申请.C语言变量并不支持动态内存申请,这一功能由库函数实现.C里面没有动态这个存储类型!! 当你

[CareerCup] 13.9 Aligned Malloc and Free Function 写一对申请和释放内存函数

13.9 Write an aligned malloc and free function that supports allocating memory such that the memory address returned is divisible by a specific power of two. EXAMPLE align_malloc (1000,128) will return a memory address that is a multiple of 128 and t

C语言动态内存的申请和释放

什么是动态内存的申请和释放? 当程序运行到需要一个动态分配的变量时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量.当不再使用该变量时,也就是它的生命结束时,要显式释放它所占用的存储空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源. 下面将介绍动态内存申请和释放的函数 1.malloc函数 在C语言中,使用malloc函数来申请内存.函数原型如下: #include<stdlib.h> void *malloc(size_t size); 参数size代表需要动

私有内存的申请与释放

1.私有内存指的是物理页自己用,无法共享 2.同样一块内存被多个进程共享时,则为共享内存Map 一.申请内存的两种方式: 通过VirtualAlloc/VirtualAllocEx申请的:Private Memory  //底层的实现完全一样 通过CreateFileMapping映射的:Mapped Memory 二.内存的申请与释放: LPVOID VirtualAlloc{ LPVOID lpAddress, // 要分配的内存区域的地址 DWORD dwSize, // 分配的大小 DW

追踪SQL Server执行delete操作时候锁的申请与释放过程

一直以为很了解sqlserver的加锁过程,在分析一些特殊情况下的死锁之后,尤其是并发单表操作发生的死锁,对于加解锁的过程,有了一些重新的认识,之前的知识还是有一些盲区在里面的.delete加锁与解锁步骤是怎么样的?什么时候对那些对象,加什么类型的琐,加锁与索引的关系是怎么样的,什么时候释放锁?整个过程锁是如何参与整个delete操作过程表的?这里通过一个非常简单的delete语句,来分析一条delete执行过程中加解锁的过程. 测试表创建 用一个最最简单的例子做了跟踪,对锁的申请和释放,有了更

C++ 在堆上开辟与释放二维、三维指针

//C++ 在堆上开辟与释放二维.三维指针 #include<iostream> using namespace std; int main() { //二级指针的开辟与释放 int number = 0; int** p = new int*[4]; for(int i = 0; i < 4; i++) //分级定义数组大小 { p[i] = new int[4]; } for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j