内存四区笔记

来源:互联网 发布:同花顺数据接口api 编辑:程序博客网 时间:2024/06/05 17:53
#include <stdio.h>#include <stdlib.h>#include <string.h>void print_arr(int *buf, int n) {    int i;    for (i = 0; i < n; ++i) {        printf("%d\n", buf[i]);    }}int main() {    int array[100] = {0};       //栈中数组    // void *malloc (size_t __size)    char *p1 = malloc(sizeof(char) * 1000);    free(p1);    int *p = malloc(sizeof(int) * 100); //在堆中申请内存,大小为100个int,当数组用    memset(p, 0, sizeof(int) * 100);      //初始化    int i;    for (i = 0; i < 100; ++i) {        p[i] = i;    }    print_arr(p, 100);    free(p);}
#include <stdio.h>#include <stdlib.h>//既要申请内存,又要有变量指向该内存,这样此时有效的,缺一不可。//内存释放与否 VS 作用域规则  是两码事//只不过栈中变量随作用域具有一致性,出了作用域,栈内存也释放了//而堆中变量出了作用域,变量失效,但堆内存若没有手动释放,则依然存在//严重错误void getheap(int *p) {    p = malloc(sizeof(int));    //getheap执行完后,p就消失了,导致指向具体堆空间的地址编号也随之消失了}//改正,利用二级指针void getheap1(int **p){    *p = malloc(sizeof(int));}int main7() {    int *p = NULL;    getheap(p);//值传递,实参没有任何变化    getheap1(&p);//正确    free(p);}//错误,不能将一个栈变量的地址通过函数的返回值返回,函数运行结束(出了作用域),栈地址就自动释放了,相当于野指针int *geta() {    auto int a = 10;    return &a;}//正确,可以通过函数的返回值返回一个堆地址,但记得,一定要freeint *geta1() {    int *p = malloc(sizeof(int));    return p;}//正确,a在静态区,不用freeint *geta2() {    static int a = 0;    return &a;}int main6() {    int *getp = geta1();    *getp = 100;    free(getp);}

0 0