1

我怎样才能声明一个像这样的数组:

int array[1000000];

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

4

4 回答 4

2

您的任务似乎正在寻找这个:

// 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())。但这不是你的任务似乎(还)。

于 2012-11-16T16:18:02.820 回答
0

函数内部的静态声明意味着,声明的变量在声明它的函数的执行之间共享。堆栈是内存中的一个位置,可以被当前正在运行的任何函数使用;当您的函数未运行时,无法保护堆栈上的区域不被覆盖。静态变量通常要么存储在数据中,要么存储在程序的 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);
}
于 2012-11-16T15:54:24.323 回答
0

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

于 2012-11-16T16:02:30.193 回答
0

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

于 2012-11-16T16:05:26.687 回答