Tag: 堆栈

在C中获取调用函数的名称(不使用预处理器)

我想知道是否有办法在C中找到称为当前函数(在运行时)的函数。 我知道你可以在gcc中使用__FUNCTION__ ,但有没有办法不使用C预处理器? 可能不是。 干杯

从C函数返回字符串

我有一个简单的代码。 #define MY_STRING “String example” char* string_return_function() { return MY_STRING; } 上面的代码有效,但我不知道如何。 我认为string_return_function()返回一个本地地址,一旦该函数退出就会被释放。

C – 使用_int16时的exception

可能重复: 正确使用具有固定大小类型的scanf / printf(和系列)的方法? 我在Visual Studio中编写了以下程序: 在运行程序并退出时,我收到错误消息“堆栈变量b已损坏”。 如果我用int替换_int 16,则不会引发exception。 我该怎么解决这个问题呢? 我必须使用_int16,因为我想模拟整数溢出。 谢谢 :)

关于读/写速度的堆与堆栈

我刚刚在Stack Overflow(以及通过Google找到的其他随机站点)上经历了一堆堆栈与堆线程,但我找不到能够为读/写速度问题提供更多(如果有的话)深度的答案(大多数答案和文章都关注分配速度)。 如果我正在编写一个C程序(在我的情况下,一个游戏),我将对象数据存储在一个几千字节的缓冲区中,如果分配了该缓冲区,它是否会产生差异(就访问速度而言)在堆栈上还是在堆上? 或者,在决定存储它的硬件(即缓存或RAM)的位置时,编译器是否会以相同的方式处理该大小的缓冲区?

在这段代码中哪些可变部分存储到堆栈中?

我有以下代码,我真的不明白test_function中的哪些变量部分存储在堆栈段中? 在书中它说“这些变量的内存在堆栈段中”,所以我认为它是变量实际初始化为一个值的时候。 对? void test_function(int a, int b, int c, int d) { int flag; //is it this char buffer[10];// and this //or flag = 31337; //this and buffer[0] = ‘A’; //this. Or all of it? } int main() { test_function(1, 2, 3, 4); }

创建递归二叉树?

我有两个堆栈,一个用操作数,另一个用操作符。 我的问题是将这两个堆栈变成二叉树。 例如,表达式(2+3)*(4-3)将被转换为后缀(例如24+43-* ),然后放入两个堆栈3442和*-+将成为堆栈(顶部为分别为3和*)。 现在使用这些堆栈,我需要形成一个像二进制树 * + – 2 3 4 3 有没有办法递归地做到这一点? 现在,我有一个像这样的算法: 创建树的根,将根的值分配给operator-stack中的第一个运算符。 将右指针和左指针设置为null。 创建正确的节点,如果存在,则分配下一个运算符的值,如果不为其分配操作数。 然后对左节点执行相同操作。 我的问题是使这个递归,或让它来处理许多不同的情况。 谢谢你的帮助。

getaddrinfo addrinfo导致堆栈或堆

至少我有点困惑。 getaddrinfo()调用’updates’指向addrinfo结构的指针,当我要在相同的范围(该函数)中使用addrinfo时,一切都很好但是如果我将结构复制到另一个(通过分配它)会发生什么。 请帮助我理解正在进行的基础知识(不寻求替代方法的建议)。 如果我错了,请纠正我:a)getaddrinfo()需要指向addrinfo的struct-pointer的指针。 b)getaddrinfo在当前函数作用域中创建addrinfo结构并更新a)中所需的指针 现在我真正的问题是:我想将addrinfo存储在其他地方。 使用分配给另一个指针不会执行深层复制,并且在该函数之后所有指针都变为无效? 最好给出一个非常简单的例子: void GetAddrInfo(struct addrinfo *update) { struct addrinfo *res; getaddrinfo(xx,xx,xx,&res); //is this save? After this ‘scope’ ends all pointed fields are invalid? //this doesn’t copy the linked list ai_next. *update=*res; } 直接使用和更新getaddrinfo似乎不起作用,因为问题仍然存在:原始结构在函数范围结束后被销毁。 任何人都可以在这里给我更多的见解(请解释在哪里创建的内容和销毁位置,堆栈,堆欢迎所有信息)

C函数堆栈布局

我有一个看起来像这样的function: int bof(char *str) { char buffer[12]; strcpy(buffer, str); return 1; } 我试图覆盖其返回地址。 我发现我可以使用例如memcpy(buffer+24, “\x15\xf1\xff\xbf”, 4) 。 我不明白的是为什么我需要访问buffer + 24 。 我对C内存模型的理解告诉我,执行这个函数时的堆栈应该是这样的 bottom of top of memory memory buffer(12) sfp(4) ret(4) str(4) top of bottom of stack stack 这表明我应该将ret地址从buffer + 16开始。 额外的8个字节在哪里? 顺便说一下,我在32位系统上运行它。

什么可以导致Valgrind堆栈跟踪中的奇怪地址?

(这个问题与从valgrind输出中过滤掉垃圾有关)。 我正在尝试调试一个大部分项目中的内存泄漏,这个项目大部分都不在我的手中 – 它是代码库的一个分支,大约有数百万行代码,尽管大部分可能与代码库无关。我正在努力的一小部分。 由于手工查看它非常困难,我正在尝试使用valgrind来追踪泄漏。 问题是堆栈跟踪看起来像这样: ==83597== 920 bytes in 1 blocks are possibly lost in loss record 750 of 864 ==83597== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==83597== by 0x548EF93: myproject_malloc (mysourcefile.c:48) ==83597== by 0x4F13FD5: ??? (in /path/to/project/library-version.so) ==83597== by 0xFFEFFFD5F: ??? ==83597== by 0x38F: ??? ==83597== by 0xFFEFFFE5F: ??? ==83597== by 0xF: ??? ==83597== […]

使用GCC + ARM减少递归期间的堆栈使用

我有一个用于嵌入式ARM处理器的递归下降解析器(在C + GCC中,用于ARM Cortex M3)。 在运行它的同时我注意到它使用了大量的堆栈空间(甚至超出了你的预期)并且经过仔细检查我发现这种情况正在发生: extern int bar(int *p); int foo() { int z = foo(); // it’s an example! int n[100]; // stack usage return z+bar(n); // calling bar(n) stops n from being optimised out } 运行arm-none-eabi-gcc -fomit-frame-pointer -S test.c的结果 foo: str lr, [sp, #-4]! ; Push link register sub sp, sp, #412 […]