美文网首页
C语言-静态开辟内存和动态开辟内存

C语言-静态开辟内存和动态开辟内存

作者: 大虾啊啊啊 | 来源:发表于2022-07-27 11:31 被阅读0次

1、静态开辟内存

在函数局部内,创建的数据,在执行函数的时候会进栈操作,函数执行完毕,会执行弹栈。因此会释放栈内的成员,栈内的数据也称之为栈内成员,这种方式开辟的内存,称为静态开辟,执行完会弹栈。不会占用内存空间。

// 进栈
void staticAction() {
    int arr[5]; // 静态开辟 栈区 (栈成员)

    for (int i = 0; i <5; ++i) {
        arr[i] = i;
        printf("%d, %p\n", *(arr + i), arr + i);
    }
} // 函数的末尾会弹栈(隐士):执行完毕会弹栈  会释放所有的栈成员

// 2.静态开辟。
int main() {
    // int 4 * 10 = 40M
    // int arr[10 * 1024 * 1024]; // 10M * 4 = 40M  会栈溢出
    // int arr[1 * 1024 * 1024]; 会栈溢出
    int arr[(int)(0.2 * 1024 * 1024)]; //  不会栈溢出
    // 栈区:占用内存大小 最大值: 大概 2M  大于2M会栈溢出  平台有关系的
    // 堆区:占用内存大小 最大值: 大概80%  40M没有任何问题,基本上不用担心 堆区很大的
    // 大概80%: Windows系统 给我们的编译器给予的空间  的 百分之百八十
    staticAction(); // 调用开辟20
    return (0);
}

2、动态开辟内存

有时候我们需要用到动态开辟内存,比如有时候我们需要动态设置数组的大小。
使用malloc函数,可以动态开辟内存,这种方式的空间属于在堆中开辟,函数执行完毕之后,不会释放堆空间,因此我们一定要手动释放free,并把指针指向NULL。避免悬空指针。

/// 函数进栈 定义一个int arr[5];  定义一个 int i;  (静态的范畴)

// malloc 在堆区开辟的内存空间 , (动态的范畴)

// C的开发过程中,不能出现,野指针,悬空指针
void dynamicAction() {
    int *p; // 野指针  没有地址的,空的

    // void * 可以任意转变   int*  double *
    int *arr = malloc(1 * 1024 * 1024); // 堆区开辟 4M

    printf("dynamicAction函数,arr自己的内存地址:%p,堆区开辟的内存地址:%p\n", &arr, arr);

    // C工程师,堆区开辟的空间,必须释放
    free(arr); // 释放掉
    arr = NULL; // 重新指向一块内存地址00000

    printf("dynamicAction函数2 堆区开辟的内存地址:%p\n", arr); // 悬空指针
}

int main() {

    dynamicAction(); // 调用开辟20
    return 0;
}

相关文章

网友评论

      本文标题:C语言-静态开辟内存和动态开辟内存

      本文链接:https://www.haomeiwen.com/subject/emczirtx.html