加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

堆栈分配的内存与动态分配的内存

发布时间:2020-12-16 10:21:00 所属栏目:百科 来源:网络整理
导读:gcc 4.6.2 c89 我只是想知道什么可能导致更多的内存问题.例如,如果在堆栈上分配结构数组,或者如果要在堆上动态分配它. 通常,我遵循一个简单的规则.如果只在该函数中使用该结构,那么我在堆栈上进行分配.但是,如果我需要通过将其保存在内存中而在其他地方引用
gcc 4.6.2 c89

我只是想知道什么可能导致更多的内存问题.例如,如果在堆栈上分配结构数组,或者如果要在堆上动态分配它.

通常,我遵循一个简单的规则.如果只在该函数中使用该结构,那么我在堆栈上进行分配.但是,如果我需要通过将其保存在内存中而在其他地方引用它,我会动态分配.

之所以我问这个问题,因为我的一些内存被破坏了,我被告知我应该动态分配而不是堆栈中的结构数组.堆栈内存有更多机会被破坏.但是,如果动态分配的内存损坏,您可以轻松释放它.

上述对任何人都有意义吗?

非常感谢任何建议,

解决方法

我不会说任何一种分配结构的方式都有“更多的腐败机会”.无论导致腐败的原因是什么,都可以轻松地发生,但是它被分配了.

我会说你最好修复腐败的来源:你可以使用gdb通过watch< varname>写一个断点来写入损坏的变量.或者,您也可以在检测到损坏时设置断点,然后使用reverse debugging查找损坏发生的位置.

编辑:关于堆栈和static分配的含义似乎有些混乱:

void foo() {
    int a[10]; // stack
    static int b[10]; // static

    int *c = malloc(sizeof(int) * 10); // dynamic on the heap
}

堆栈变量仅在函数的生命周期内有效 – 一旦此函数返回,您就不能指望a位置的数据仍然有效.有时这些被称为本地或自动变量.

函数内部的静态变量在函数外部也是有效的 – 数据在函数调用之间保持不变.这意味着如果你这样做:

void foo() {
    static int a = 0;
    a++;
    printf("%dn",a);
}

每次调用foo()时打印的数字都会增加1.通常,函数没有多个声明为static的变量,因为静态变量会记住上次调用函数时的最后一个值 – 这通常不是您想要的行为.这可能是告诉你静态变量“更有可能被破坏”的人的意思.

堆变量从创建时到有空()时都有效.这也称为动态分配,如果您计划将数据返回到程序的其他部分(或者如果要在C89中指定运行时数组的长度),则可以使用它.

旁白:静态是混淆的,当应用于全局范围中的函数名称或变量时:

static void foo() { ... }
static int x;

它表示“此功能或变量仅在此翻译单元内可见”.我不确定为什么static关键字有这两种不同的含义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读