【问题标题】:How are static, stack, and heap allocation different?静态、堆栈和堆分配有何不同?
【发布时间】:2012-11-05 08:50:44
【问题描述】:

如何声明这样的数组:

int array[1000000];

作为静态数组、堆栈数组和堆分配数组?

【问题讨论】:

  • 这没有任何意义......如果它在堆栈上,它也会被从堆栈中推送/弹出,并且不会满足static 的要求。
  • 也许他在问如何制作静态本地?当然,这很简单——语法是一样的,你只要把它放在一个函数中,就像任何其他本地函数一样。
  • 他可能想知道为什么当staticnot 时,当他进入一个将 ESP 递减 4/8 MB 的函数作用域时,运行时会出现下溢。那里。只是一种预感,白话让他感到困惑。亚当?你想要这个是因为你的程序在没有static 存在的情况下进入这个函数就死了吗??
  • 我想要它,因为我不知道如何在 C 中的堆栈上实现一个数组。它不喜欢具有 Stack 类的 Java
  • @AdemHaklı:要在堆栈上声明该数组,请编写如下函数:void foo() { },然后将该数组 (int array[1000000];) 复制并粘贴到函数的大括号之间,因此它变成void foo() { int array[1000000]; }。哇,那是堆栈上的一个数组。

标签: c arrays static stack


【解决方案1】:

你的任务似乎在寻找这个:

// global variable; NOT on the stack. Exists in the data segment of the program
int globalvar[1000000];

void func()
{
    // local stack-variable. allocated on the stack on function entry
    //  unavailable outside this function scope.
    int stackvar[1000000];

    // allocated on the heap. the only stack space used in the
    //  space occupied by the pointer variable.
    int *heapvar = malloc(1000000 * sizeof(int));
    if (heapvar != NULL)
    {
        // use heap var

        // free heap var
        free(heapvar)
    }
}

或者这样:

void func()
{
    // static variable; NOT on the stack. Exists in a program data segment (usually)
    static int staticvar[1000000];
    
    // local stack-variable. allocated on the stack on function entry
    //  unavailable outside this function scope.
    int stackvar[1000000];

    // allocated on the heap. the only stack space used in the
    //  space occupied by the pointer variable.
    int *heapvar = malloc(1000000 * sizeof(int));
    if (heapvar != NULL)
    {
        // use heap var

        // free heap var
        free(heapvar)
    }
}

对于它的价值,除非你有一个 4 或 8 兆字节的保留调用堆栈(或更大),否则上面的函数可能会在进入时发出嘶哑的声音。对于如此大的尺寸,习惯上使用堆 (malloc()/free())。但这不是你的任务似乎(还)。

【讨论】:

  • 如果在函数中创建数组,那么它会自动入栈吗?
  • @AdemHaklı 当按上述方式创建时(两个示例中的 stackvar)
  • 好的,谢谢。我必须从堆中创建一个数组,这是我要问的另一个问题。我该怎么做,你能写得更详细吗?
  • @AdemHaklı 上述答案中的堆变量用法。希望对您有所帮助。
【解决方案2】:

函数内部的静态声明意味着,声明的变量在声明它的函数的执行之间共享。堆栈是内存中的一个位置,可以被当前正在运行的任何函数使用;当您的函数未运行时,无法保护堆栈上的区域不被覆盖。静态变量通常要么存储在数据中,要么存储在程序的 bss 部分中。如果您有严格要求将数组放入堆栈,您可以尝试复制它:

void foo(void) {
   static int my_static_array[16];
   int array_copy[16];

   memcpy(array_copy,my_static_array,sizeof array_copy);

   /* do funny stuff */

   memcpy(my_static_array,array_copy,sizeof my_static_array);
}

【讨论】:

  • 我不明白的堆栈部分在哪里?
  • @AdemHaklı 声明没有任何存储类(例如静态)的变量通常(总是?)存储在堆栈中,因为没有其他方法可以将存储分配给函数。
【解决方案3】:

静态变量不能在堆栈上,这是因为静态变量和局部变量根本不同,局部变量“活”在堆栈中,而静态变量“活”在静态段中。如果您希望局部变量对声明局部变量的函数调用的函数可见,那么您应该将该局部变量作为参数传递。 另一个解决方案不推荐是有一个指向数组的静态指针并让它指向堆栈中存在的数组,只要声明本地数组的函数有,这将起作用没有返回。虽然返回后指针会指向一个可能存在其他数据的区域,这意味着可以覆盖返回地址或不相关的局部变量或函数参数。

【讨论】:

    【解决方案4】:

    如果您希望它公开array,您可以在任何范围之外(代码块之外)定义它,它将在二进制文件的文本段上声明。

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 2019-05-17
      • 2017-08-12
      • 2011-04-20
      • 2014-08-12
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      相关资源
      最近更新 更多