Tag: 堆栈

gcc,内联汇编 – pushad / popad缺失?

有什么方法可以避免将pushad / popad指令体复制粘贴到我的代码中? 因为gcc(当前标志: -Wall -m32 )抱怨这一点 __asm__(“pushad;”); 错误:没有这样的指令:`pushad’ __asm__(“popad;”); 错误:没有这样的指令:`popad’

现代计算机的堆栈和堆空间

用C语言编写时,如何在启动程序时判断内存中可用的堆栈空间是多少? 堆空间怎么样? 如何判断程序执行期间使用了多少内存?

C中的通用堆栈

我在C中实现generics堆栈,我在stackPop方法中遇到问题。 我的结构如下: “Stack.h”文件 typedef struct{ void *elems; int elemSize; int allocLength; int logLength; void (*freefnc)(void *); } Stack; void stackNew(Stack *s, int elemSize, void (*freefnc)(void *)); void stackDispose(Stack *s); void stackPush(Stack *s, void *elemAddr); void stackPop(Stack *s, void *target); Stack.c #inlcude void stackNew(Stack *s, int elemSize, void (*freefnc)(void *)){ s.allocLength = 4; s.logLength = 0; […]

默认情况下忽略null字符

我正在尝试用数组实现堆栈! 每次我执行程序运行正常但我收到警告,因为默认情况下忽略空字符 这个警告意味着什么?我做错了什么? 我的代码是: #include #include # define MAX 10 int top=-1; int arr[MAX]; void push(int item) { if(top==MAX-1) { printf(“OOps stack overflow:\n”); exit(1); } top=top+1; arr[top]=item; }//warning int popStack() { if(top==0) { printf(“Stack already empty:\n”); exit(1); } int x=arr[top]; top=top-1; return x; } void display() { int i; for(i=top;i>=0;i–) { printf(“%d “,arr[i]); } return; […]

何时为局部变量分配堆栈空间?

我对以下C代码有疑问: void my_function() { int i1; int j1; // Do something… if (check_something()) { int i2; int j2; // Do something else… } // Do some more stuff… } 是否有关于何时为i2和j2分配/解除分配堆栈空间或是否依赖于编译器的保证? 我希望当i2和j2进入范围时调整堆栈指针,并在它们超出范围时进行调整,但后来认为某些编译器可能只是“优化”整个事物并在嵌套范围内考虑变量。首先输入该function。 我知道我可以查看我的编译器生成的汇编代码,但是想知道实现是否可以留给编译器。 谢谢!

堆栈内存是否有限制?

我正在经历其中一个主题。 一个程序崩溃了,因为它在函数内部声明了一个10 ^ 6的数组。 给出的原因是堆栈上的内存分配失败导致崩溃。 当全局声明相同的数组时,它运行良好。(堆上的内存保存了它)。 现在,让我们假设,堆栈向下增长并向上堆积。 我们有: – -堆 – – ——————- – -堆 – – 现在,我相信如果堆栈上的分配失败,它也必须在堆上失败。 所以我的问题是:堆栈大小有限制吗? (超过限制导致程序崩溃)。 或者我错过了什么?

了解堆栈分配和对齐

我试图理解堆栈对齐是如何工作的,如什么是“堆栈对齐”? 但我很难得到一个小例子来certificate上述行为。 我正在检查我的函数foo的堆栈分配: void foo() { int a = 0; char b[16]; b[0] = ‘a’; } 我使用gcc -ggdb example.c -o example.out编译源文件(即没有任何编译器标志),并且gdb中的汇编器转储读取: (gdb) disassemble foo Dump of assembler code for function foo: 0x08048394 : push %ebp 0x08048395 : mov %esp,%ebp 0x08048397 : sub $0x20,%esp 0x0804839a : movl $0x0,-0x4(%ebp) 0x080483a1 : movb $0x61,-0x14(%ebp) 0x080483a5 : leave 0x080483a6 […]

C:你如何模拟’例外’?

我来自C#背景,但我现在正在学习C语言。 在C#中,当想要发出错误信号时,就会抛出exception。 但你在C做什么? 比如说你有一个带有push和popfunction的堆栈。 在pop ,什么是表示堆栈为空的最佳方式? 你从这个function返回什么? double pop(void) { if(sp > 0) return val[–sp]; else { printf(“error: stack empty\n”); return 0.0; } } K&R的第77页示例( 上面的代码 )返回0.0 。 但是如果用户在堆栈上先推了0.0 ,那么如何知道堆栈是否为空或者是否返回了正确的值呢?

C最佳实践,堆栈与堆分配

我最近一直在使用ca,并发现我真的不喜欢处理内存管理,或者至少我认为如果我malloc指针我必须释放它,即使它是最琐碎的事情。 这导致我尽可能多地在堆栈上分配并使用&来获取它的位置。 甚至制作单独的int和inptr变量(我在宏中使用&运算符时出现了一些左值问题)。 我没有找到很多地方我必须处理分配它的数据(上/下)。 与此同时,我需要相当数量的早期回报(而且我宁愿避免使用)。 一般的c意见是什么? 在特定情况下我是否应该使用其中一个或另一个明显的迹象。 PS让我有点担心的一件事是,我最近因为使用了错误的sizeof for malloc而出现了内存损坏问题而且我没有立即注意到它,因为我的大部分代码路径直接在那之后没有使用堆。 你认为这种腐败隐藏的问题有多大?

是否更快地访问堆中的数据?

我知道这听起来像是一个普遍的问题而且我已经看过很多类似的问题(无论是在这里还是在网上),但它们都不是我的困境。 说我有这个代码: void GetSomeData(char* buffer) { // put some data in buffer } int main() { char buffer[1024]; while(1) { GetSomeData(buffer); // do something with the data } return 0; } 如果我在全局声明缓冲区[1024],我会获得任何性能吗? 我通过time命令在unix上运行了一些测试,执行时间之间几乎没有差异。 但我真的不相信…… 理论上,这种变化应该有所作为吗?