静态,堆栈和堆分配如何不同?
你的任务似乎是在寻找这样的:
// 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)
}
}
对于什么是值得的,除非你有四个或八个兆字节保留调用堆栈(或更大),上述功能可能会导致入侵。对于如此大的尺寸,通常使用堆(malloc()
/free()
)。但那不是你的任务似乎(尚)。
如果你在一个函数中创建一个数组,那么它会自动在栈上? –
@AdemHaklı当创建如上(stackvar在两个样本)**是** – WhozCraig
好的thanks.i必须从堆中创建一个数组,这是我要问的另一个问题。我该怎么做才能把它写得更详细些? –
函数内部的静态声明意味着声明的变量在声明的函数的执行中被共享。堆栈是内存中的一个地方,可以被任何正在运行的函数使用;当您的功能未运行时,无法保护堆栈上的某个区域不被覆盖。静态变量通常存储在数据中,或者单独存储到程序的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ı声明没有任何存储类(如静态)的变量通常(总是?)存储在堆栈上,因为没有其他方法可以将存储分配给函数。 – fuz
静态变量不能在堆栈上,这是因为静态的,局部变量是根本不同的,与本地变量“生活在”堆栈中,而静态变量“静止”在静态段中。如果你希望局部变量对声明局部变量的函数调用的函数可见,那么你应该将该局部变量作为参数传递。 另一个解决方案不建议是有一个指向数组的静态指针,并指向数组中存在的数组,只要局部数组声明的函数没有返回,这将工作。返回后,指针会指向一个可能存在其他数据的区域,这意味着可以覆盖返回地址或不相关的局部变量或函数参数。
如果您希望公开array
,您可以在任何作用域之外(代码块之外)定义它,并且它将在二进制文本段中声明。
这没有任何意义......如果它在堆栈上,它也会从堆栈中弹出/弹出,并且不会满足“静态”要求。 – Cornstalks
也许他在问如何制作一个静态的本地?但是,这当然是微不足道的 - 语法是一样的,你只要把它放在像其他任何本地一样的函数中。 –
他可能想知道为什么运行时会在发生下溢时立即进入一个函数的作用域,当静态是* not *时,ESP会将ESP减少四/八兆字节。只是一种预感,白话让他感到困惑。阿德姆?你是否想要这样做,是因为你的程序在输入这个函数时死了,而没有'static'出现? – WhozCraig