Tag: stack

推Lua表

我在C中创建了一个Lua表,但我不确定如何将该表推到堆栈的顶部,这样我就可以将它传递给Lua函数了。 有谁知道如何做到这一点? 这是我目前的代码: lua_createtable(state, libraries.size(), 0); int table_index = lua_gettop(state); for (int i = 0; i < libraries.size(); i++) { lua_pushstring(state, libraries[i].c_str()); lua_rawseti(state, table_index, i + 1); } lua_settable(state, -3); [ Push other things ] [ Call function ]

什么时候堆栈分配

即使在C(不仅仅是C ++)中,您也可以在代码块的开头声明变量,该代码块用大括号括起来。 例: #include void use_stack(int cnt) { if (cnt<=16) { int a[16]; int i; a[0]=3; a[1]=5; for (i=2;i<cnt;i++) { a[i]=a[i-1]+a[i-2]; } printf("a[%d] == %d\n",cnt-1,a[cnt-1]); } else { printf("cnt is too big\n"); } } 现在我知道像数组a[16]这样的变量在这种情况下被分配在堆栈上。 我想知道这个数组的空间是在函数的开头(第一个打开花括号)还是在声明它的块的开头分配(在if之后打开花括号)。 从检查汇编代码开始,编译器似乎直接在函数入口处为a[16]分配空间。 我实际上期望在a[16]的声明处分配堆栈(堆栈指针减少),并且堆栈将在相应的if代码块的末尾被解除分配(堆栈指针增加)。 但是这似乎没有发生(即使在a[16]分支中没有使用a[16] , a[16]堆栈直接在函数入口处分配)。 有没有人解释为什么会这样? 那么是否有C语言标准的任何部分,它解释了这种行为,或者是否与“longjmp”或信号处理有关,这可能要求堆栈指针在函数内部是“常量”? 注意:我假设堆栈的原因是在代码块的开头/结尾分配/解除分配,因为在C ++中,在堆栈上分配的对象的构造函数/析构函数将在代码块的开头/结尾处调用。 因此,如果您检查C ++程序的汇编代码,您会注意到堆栈仍然在函数入口处分配; 只是构造函数/析构函数调用将在代码块的开始/结束时完成。 我明确感兴趣的是为什么堆栈没有使用花括号在代码块的开头/结尾分配/解除分配。 问题: 在什么时刻是本地变量分配存储? 仅涉及在函数开始时分配的局部变量。 我很惊讶稍后在代码块内分配的变量的堆栈分配也在函数入口处完成。 到目前为止,答案是: 与优化有关 […]

当我们在c中使用fork时,进程之间是否共享数据?

在这个C程序中,数据不在进程即父进程和子进程之间共享。 child拥有它自己的数据,而parent拥有它自己的数据,但指针显示两个进程的相同地址。 它是如何在后台完成的? fork是否生成相同数据的副本? 如果是这样,那么我们对两个进程都有相同的指针地址。 或者是由于为每个进程复制的静态分配数据而且每个进程的数据是独立的? 我想知道它是如何完成的? #include #include #include int main() { //Static Array int X[] = {1,2,3,4,5}; int i, status; //The fork call int pid = fork(); if(pid == 0) //Child process { //Child process modifies Array for(i=0; i<5; i++) X[i] = 5-i; //Child prints Array printf("Child Array:\t"); for(i=0; i<5; i++) printf("%d\t", X[i]); […]

如何从堆栈中弹出不同类型的结构

我有一个包含两种类型结构的堆栈。 结构螺柱和结构教授当我想要推动某些东西时,我为两个结构创建了两个推送function。 虽然我希望它有一个function,但它可以,我可以忍受它。 现在去Pop。 如果我想从Stack中弹出一个学生,我是否必须专门为学生制作一个Popfunction? 教授一样吗? 如果我不知道它是什么类型,我该如何存储该项目? 元素必须是什么类型,才能将项目存储在那里? 结构如下: struct MyStack { int head; void **stack; int size; }; typedef struct MyStack STACK; struct stud { char flag; char fname[50]; int semester; }; struct prof { char flag; char fname[50]; char course[30]; }; 现在创建Popfunction。 我在函数中传递了什么类型的项目? int Pop(STACK *stack,int *head,??? *elem) { if(stack->headstack[*head]; *head–; return 1; […]

堆栈中的变量顺序(GCC)

在GCC中编译C代码时,是否有任何方法可以保证堆栈变量按照我声明的顺序出现在堆栈中(或者按相反的顺序,对我来说无关紧要)? 我知道这可能是通过结构,但我宁愿不使用它们。

声明变量堆栈

我有2个文件名为auth_overflow&auth_overflow2,唯一的区别是变量声明的序列。 我的问题是,声明序列是否会根据FILO影响它们的堆栈序列(先排在后面)? auth_overflow bash-4.2$ gdb -q auth_overflow Reading symbols from /home/reader/hacking/auth_overflow…done. (gdb) list 5 int check_authetication (char *password) { 6 int auth_flag = 0; 7 char password_buffer[16]; 8 9 strcpy(password_buffer, password); (gdb) break 9 Breakpoint 1 at 0x804850d: file auth_overflow.c, line 9. (gdb) run AAAAAAAAAAAA Starting program: /home/reader/hacking/auth_overflow AAAAAAAAAAAA Breakpoint 1, check_authetication (password=0xbffff7f3 ‘A’ ) […]

Lock Free堆栈实现的想法 – 目前已经破解

我想出了一个想法,我试图实现一个无锁堆栈,不依赖引用计数来解决ABA问题,并且还正确处理内存回收。 它在概念上与RCU类似,并且依赖于两个特征:将列表条目标记为已删除,以及跟踪阅读器遍历列表。 前者很简单,它只使用指针的LSB。 后者是我对实现无限制无锁堆栈的方法的“聪明”尝试。 基本上,当任何线程试图遍历列表时,一个primefaces计数器(list.entries)会递增。 遍历完成后,第二个计数器(list.exits)递增。 节点分配由push处理,释放由pop处理。 推送和弹出操作与天真无锁堆栈实现非常相似,但必须遍历标记为删除的节点才能到达未标记的条目。 因此推送基本上就像链表插入一样。 pop操作类似地遍历列表,但它使用atomic_fetch_or将节点标记为在遍历时被删除,直到它到达未标记的节点。 遍历0个或更多标记节点的列表后,弹出的线程将尝试CAS堆栈的头部。 至少有一个并发弹出的线程将成功,在此之后,进入堆栈的所有读者将不再看到以前标记的节点。 成功更新列表的线程然后加载primefaceslist.entries,并基本上自旋加载atomic.exits,直到该计数器最终超过list.entries。 这应该意味着列表的“旧”版本的所有读者都已完成。 然后,该线程只是释放它从列表顶部交换的标记节点列表。 因此,弹出操作的含义应该(我认为)可能没有ABA问题,因为释放的节点不会返回到可用的指针池,直到所有使用它们的并发读取器完成,显然内存回收问题由于同样的原因,处理也是如此。 所以,无论如何,这是理论,但我仍然在实施上摸不着头脑,因为它目前无法正常工作(在multithreading情况下)。 似乎我在免费问题之后得到了一些写作,但是我在查找问题时遇到了麻烦,或者我的假设可能存在缺陷而且无法正常工作。 无论是概念还是调试代码的方法,都会非常感谢任何见解。 这是我当前(损坏的)代码(使用gcc -D_GNU_SOURCE -std = c11 -Wall -O0 -g -pthread -o list list.c编译): #include #include #include #include #include #include #include #include #define NUM_THREADS 8 #define NUM_OPS (1024 * 1024) typedef uint64_t list_data_t; typedef struct list_node_t { struct […]

当确定使用的c ++程序堆栈大小?

我知道链接上的最大堆栈大小通常是固定的(也许是在Windows上)。 但我不知道何时使用的程序堆栈大小(不是最大堆栈大小)使用的是固定到OS。 编译? 联系? 执行 ? 像这样: int main(){ int a[10]; return 0;} 该程序只使用10 * sizeof(int)堆栈。 那么,堆栈大小是固定的吗? 首先。 如果在malloc或free时更改堆大小?

Java内插器中的堆栈粉碎

我正在编写一个Java内插器来修改与网络通信相关的系统调用。 基本上,我想修改目标收件人的IP和端口。 代码在我的笔记本电脑上正常工作,但在大学PC上,它给出了一个堆栈粉碎错误 : *** stack smashing detected ***: java terminated ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb7702dd5] /lib/i386-linux-gnu/libc.so.6(+0xffd8a)[0xb7702d8a] /home/mwaqar/vibe/ldinterposer_2.so(+0x28e4)[0xb77c98e4] /home/mwaqar/vibe/ldinterposer_2.so(connect+0x9c5)[0xb77c9093] /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/libnet.so(+0xceff)[0x8b226eff] /usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/libnet.so(Java_java_net_PlainSocketImpl_socketConnect+0x4c1)[0x8b227c51] 相关代码( 连接系统调用的插入)如下: int connect(int fd, const struct sockaddr *sk, socklen_t sl) { struct sockaddr_in *lsk_in = (struct sockaddr_in *) sk; struct sockaddr_in6 *lsk_in6 = (struct sockaddr_in6 *) sk; struct sockaddr_in addr4; unsigned int len; int […]

如何在函数内使指针(到结构)为空

一个class轮问题: 有人可以解释为什么thisNode=NULL在函数中不起作用以及如何以其他方式实现相同的结果。 介绍: 在我开始研究数据结构时,我最近开始使用指针构建了很多。 历史: 我编写了堆栈,队列,二叉搜索树和表达式树,并将很快开始编写avl树。 作为一名学生,我仍然没有意识到许多概念,并希望得到任何帮助。 方法: 我总是找到其他方法来实现我所需的结果(使头节点归零),比如在main函数中将其置零,或者最终不将它归零并将其保持为具有空数据的头/根节点,然后添加其他(有用的)节点。 (仅用作头部或指向结构的指针) 混乱: 我不明白为什么在函数中对指向struct的指针归零不起作用,但是更改结构数据成员的值之类的其他事情也没有问题。 例如: thisNode->nextNode->data = thisNode->data; *//this does works* thisNode = NULL; *//this doesn’t work* 图片: 题: 有人可以解释为什么thisNode=NULL在函数中不起作用以及如何以其他方式实现相同的结果。 问题领域: void stackPop(stackNode *headNode){ if (headNode!=NULL){ if (headNode->nextNode!=NULL){ stackNode *tempNode = getLatestStackNode(headNode); tempNode->prevNode->nextNode=NULL; tempNode->prevNode==NULL; tempNode->data==’.’; tempNode=NULL; free(tempNode); }else if (headNode->nextNode==NULL){ headNode->data=’\0′; headNode = NULL; free(headNode); } }else{ […]