Tag: 堆栈

分配了alloca的内存在函数结束时或范围结束时被释放?

如果我有这样的function: void bla(int size) { while(b){ char tmp[size]; …… } } tmp在while循环的每次迭代中被释放,对吗? 如果我写这个函数: void bla(int size) { while(b){ char* tmp = alloca(size); …… } } tmp在范围结束时或function结束时被释放?

识别地址是属于堆还是堆栈还是寄存器

我有一个指针可用于C / C ++变量。 是否有可能准确地确定此变量属于哪个内存段? 如果有,怎么样? 注意:我只有这个变量的地址,如果变量是本地/全局等,则没有进一步的信息。

C – 在’=’之前的预期表达式…在没有’=’的行上

我疯狂地试图弄清楚这个与现实/我的代码没有明显联系的错误信息。 我一直在这里搜索并得出一个结论:你会讨厌被typedef隐藏的指针。 对不起,这是我无法控制的 – 教授提供了这样的代码。 我正在编辑问题中指定的代码。 我正在弹出整个节点以避免每个推送function上的malloc调用并将它们存储在辅助堆栈中。 MakeEmptyS函数使用INITIAL_SIZE节点初始化Stack。 GrowEmptyS向空节点堆栈添加更多节点 stack.c具有以下function: void MakeEmptyS( Stack S ) { PtrToNode tmp; if ( S == NULL ) Error( “Must use CreateStack first” ); else { GrowEmptyS( S, INITIAL_SIZE); while (!IsEmptyS( S) ) { tmp = TopopNode( S ); PushEmpty( S, tmp); } } } 我收到此错误:“Stack.c:53:22:错误:’=’标记之前的预期表达式”,其中第53行是GrowEmptyS(S,INITIAL_SIZE); 作为参考,这里是Grow函数: void GrowEmptyS( […]

C中的递归堆栈

在递归期间,会创建一个堆栈,该堆栈包含什么,它包含值还是存储操作数的地址 void recursiveReverse(struct node** head_ref) { struct node* first; struct node* rest; /* empty list */ if (*head_ref == NULL) return; /* suppose first = {1, 2, 3}, rest = {2, 3} */ first = *head_ref; rest = first->next; /* List has only one node */ if (rest == NULL) return; /* reverse the rest […]

打印堆栈框架

所以我目前正在学习堆栈帧,我想实验打印一个函数的堆栈帧(手动)。 我有以下图片记住堆栈框架(我可能是错的): | | 0xffff0fdc +——————————–+ | … | 0xffff0fd8 +——————————–+ | parameter 2 | 0xffff0fd4 +——————————–+ | parameter 1 | 0xffff0fd0 +——————————–+ | return address | 0xffff0fcc +——————————–+ | local variable 2 | 0xffff0fc8 +——————————–+ | local variable 1 | 0xffff0fc4 +——————————–+ 因此我首先写了这个函数来实现上面的结果并打印出来: void func(int a,int b) { uint64_t loc = 0; uint64_t *sp […]

gcc如何确定基于C的函数将使用的堆栈大小?

我用C编程语言编写程序,并使用objdump将可执行文件转换为asm文件。 我不知道gcc如何确定函数将使用的堆栈大小? int a() { int temp[1024 * 1024]; temp[0] = 1; return temp[0]; } 这只是问题的解释,忽略它是天真的。 gcc是否会为函数a分配1024 * 1024字节的空间? 如果函数有点复杂,有时会有很多局部变量,编译器如何确定堆栈大小?

为什么GCC使用Mov而不是推入函数调用?

所以我有这个C程序示例。 int worship(long john) { return 0 * john; } int main() { return worship(666); } 该程序集(基本上)看起来像这样: worship(long): pushq %rbp movq %rsp, %rbp movq %rdi, -8(%rbp) movl $0, %eax popq %rbp ret main: pushq %rbp movq %rsp, %rbp movl $666, %edi call worship(long) popq %rbp ret 我在阅读堆栈粉碎时遇到了这个问题。 在assemblyworship(long):它说movq %rdi, -8(%rbp)我希望它是基于我到目前为止阅读的所有内容使用pushq 。 这是GCC将参数推入堆栈的新方法吗?如果有的话,我可以使用编译器标志来切换它吗?

C中允许的最大静态数组大小是多少?

在我的算法中,我知道使用静态数组,没有动态数组。 但我有时会达到堆栈的极限。 我是对的,静态数组是否存储到堆栈中? 哪个参数会影响一个C程序的最大堆栈大小? 是否存在影响最大arrays大小的系统参数? 最大化没有。 元素取决于数组类型? 它取决于系统总RAM吗? 或者每个C程序都有一个静态的最大堆栈大小?

什么是堆栈的“标准”大小和C程序中的堆?

我已经读过Linux上的“标准”和初始堆栈大小约为8MB,Windows大约为1MB。 但堆分配如何工作? 操作系统是否为进程堆设置了“虚拟”大小,就像它对已提交和保留内存的堆栈一样?

为什么在这种特定情况下在堆栈上分配大元素不会失败?

在C中在堆栈上分配int和大数组时,程序执行时没有错误。 但是,如果我事先在堆栈上初始化变量,则会发生段错误(可能是因为大型数组超出了堆栈大小)。 如果在声明数组后初始化变量,这对我来说是有意义的。 是什么导致这种行为,记忆明智? 我的印象是,只需在堆栈上声明一个变量,就会分配所需的空间,导致在分配非常大的数据类型时立即崩溃。 我怀疑它与编译器优化它有关,但它没有意义,考虑到我在第二个例子中也没有改变foo 。 我正在使用gcc 7.2.0进行编译, 没有设置任何标志 。 在Ubuntu 17.10上执行。 这运行没有错误: int main(){ int i; unsigned char foo [1024*1024*1024]; return 0; } 这会立即崩溃: int main(){ int i = 0; unsigned char foo [1024*1024*1024]; return 0; } 有人能告诉我这里发生了什么吗?