Tag: stack

递归调用中pthread的分段错误

鉴于下面的代码,如果我运行n> 16,我会遇到分段错误。 我认为它与堆栈有关,但我无法弄明白。 有人能帮我一把吗? 代码不是我的,真的不重要。 我希望有人能帮助我了解正在发生的事情。 这个问题非常相似,但是没有足够的信息(发布答案的人简要地谈到了这个问题,然后继续谈论另一种语言)。 此外,请注意,有两个演出并且没有递归,我可以(如果我做得对)成功创建超过16000个线程(尽管操作系统仅创建大约500个并且运行大约300个)。 无论如何,我在哪里得到seg故障,为什么? 谢谢。 #include #include static void* fibonacci_thread( void* arg ) { int n = (int)arg, fib; pthread_t th1, th2; void* pvalue; /*Holds the value*/ switch (n) { case 0: return (void*)0; case 1: /* Fallthru, Fib(1)=Fib(2)=1 */ case 2: return (void*)1; default: break; } pthread_create(&th1, NULL, fibonacci_thread, […]

如何使用堆栈c评估算术表达式?

到现在为止,我刚刚完成表达式转向后缀表达式,我尝试评估,但出现了问题并让我困惑很长时间,我只知道如何解决它。 这是我的代码转向后缀表达式: #include #include #include #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 #define OK 1 #define ERROR 0 typedef char ElemType; typedef int Status; typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack; Status InitStack(sqStack *s) { s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if ( !s->base ) { exit(0); } s->top = […]

应该在堆栈上分配的变量大小是否有最大限制?

我在C中声明了一个大小超过1024字节的结构变量。 在运行Coverity(静态代码分析器应用程序)时,它报告此堆栈变量大于1024字节,因此是错误原因。 我想知道我是否需要担心这个警告? 单个堆栈变量的大小是否真的有最大限制? 谢谢,谢

x86_64调用约定和堆栈帧

我试图理解GCC(4.4.3)为在Ubuntu Linux下运行的x86_64机器生成的可执行代码。 特别是,我不明白代码如何跟踪堆栈帧。 在过去,在32位代码中,我习惯于在几乎所有function中看到这个“序幕”: push %ebp movl %esp, %ebp 然后,在function结束时,也会出现“结局” sub $xx, %esp # Where xx is a number based on GCC’s accounting. pop %ebp ret 或简单地说 leave ret 这完成了同样的事情: 将堆栈指针设置为当前帧的顶部,就在返回地址的正下方 恢复旧的帧指针值。 在64位代码中,正如我通过objdump反汇编看到的那样,许多函数不遵循这个约定 – 它们不会推送%rbp然后将%rsp保存到%rbp,像GDB这样的调试器如何构建回溯? 我真正的目标是尝试找出一个合理的地址,当执行到达程序中的任意函数的开始时,可​​以将堆栈指针向下移动时,将其视为用户堆栈的顶部(最高地址)。 例如,对于“top”,argv的原始地址是理想的 – 但我无法从主要调用的任意函数访问它。 我起初以为我可以使用旧的回溯方法:追踪保存的帧指针值,直到保存的值为0 – 然后,下一个可以算作最高实际值。 (这与获取argv的地址不同,但它会 – 比如说,找出_start或任何_start调用的堆栈指针值[例如__libc_start_main]。)现在,我不知道如何获取64位代码中的等效地址。 谢谢。

GCC – 如何重新排列堆栈?

我尝试构建一个使用pthreads和__m128 SSE类型的应用程序。 根据GCC手册,默认堆栈对齐是16个字节。 为了使用__m128,要求是16字节对齐。 我的目标CPU支持SSE。 我使用的GCC编译器不支持运行时堆栈重组(例如-mstackrealign)。 我不能使用任何其他GCC编译器版本。 我的测试应用程序如下: #include #include void *f(void *x){ __m128 y; … } int main(void){ pthread_t p; pthread_create(&p, NULL, f, NULL); } 应用程序生成exception并退出。 经过简单的调试(printf“%p”,&y)后,我发现变量y不是16字节对齐的。 我的问题是:如何在不使用任何GCC标志和属性(它们没有帮助)的情况下正确地重新对齐堆栈(16字节)? 我应该在这个线程函数f()中使用GCC内联汇编程序吗?

如何从后缀表达式中的命令行参数字符串逐字符读取? 在C编程中

如果我要这样做一个命令行参数,例如: ./program 12+42-*\ 我如何从命令行参数中读取每个字符并创建一个后缀表达式,使得12 + 42- *将计算为C中的表达式(1 + 2)*(4-2)? 一个解释,也可能是一个开始这个的伪代码将是伟大的。 你使用堆栈吗? 如果你这样做,有人可以解释如何使用/不使用伪代码吗? 谢谢! 注意12 + 42- \是一个命令行参数,所以没有空格。 这是一个赋值,这只是它的一小部分,它是通过命令行参数获取输入并使用后缀表达式

从pop函数返回错误的地址

解决了我的结构的其他问题后,我的推送按预期工作,但是我的pop返回错误的地址,我不知道为什么 – QNode* const Q_Pop(Q* const pointerQ){ … // empty check QNode* tempNode = pointerQ->front.next; pointerQ->front.next = (tempNode->next); tempNode->next->prev = &(pointerQ->front); return tempNode; } 我相当确定我的实际删除和重新链接堆栈的逻辑是正确的但我使用指针并返回它们是混乱的。 结构 – struct QueueNode { struct QueueNode *prev; /* Previous list element. */ struct QueueNode *next; /* Next list element. */ }; typedef struct QueueNode QNode; struct Queue { QNode […]

只有Postfix表达式的左关联性?

在评估后缀表达式的情况下,关联性总是从左到右吗? 如果是,为什么? 如果不是,为什么?

为什么Visual Studio中的连续int数据类型变量位于12个字节偏移?

要澄清这个问题,请观察c / c ++代码片段: int a = 10, b = 20, c = 30, d = 40; //consecutive 4 int data values. int* p = &d; //address of variable d. 现在,在visual studio(2013年测试)中,如果p == hex_value的值(可以在调试器内存窗口中查看),那么,您可以观察到,其他变量a,b,c和d的地址是每个都有12个字节的差异! 那么,如果p == hex_value ,那么它如下: &c == hex_value + 0xC (注意hexC是十进制的12) &b == &c + 0xC &a == &b + 0xC 那么,为什么有12个字节的偏移而不是4个字节 […]

在哪些情况下alloca()有用吗?

当你总是可以在堆栈上分配一个足够大的固定大小的缓冲区来满足所有用途时,你为什么要使用alloca()? 这不是一个修辞问题……