Tag:

如何使用mmap在堆中分配内存?

只是问题陈述,如何使用mmap()在堆中分配内存? 这是我唯一的选择,因为malloc()不是可重入函数。

使用箭头 – >和点。 C中的运营商

我的印象是,可以通过使用箭头和点运算符一起访问链表或类似结构的子节点中的数据,如下所示: typedef struct a{ int num; struct a *left; struct a *right; }tree; tree *sample; … if(sample->left.num > sample->right.num) //do something 但是当我尝试实现它时,使用 – >和。 从子节点访问数据我得到错误“请求成员数字不是结构或联合”。

使用堆溢出来写入任意数据

我一直在努力学习堆溢出攻击的基础知识。 我最感兴趣的是使用损坏或修改块元数据作为攻击的基础,但我也对其他建议持开放态度。 我知道我的挖掘目标应该是用challenge()函数指针覆盖printf() challenge()函数指针,但我似乎无法弄清楚如何实现该写入。 我有以下一段代码,我想利用它,它使用glibc 2.11.2 malloc : void challenge() { puts(“you win\n”); } int main(int argc, char **argv) { char *inputA, *inputB, *inputC; inputA = malloc(32); inputB = malloc(32); inputC = malloc(32); strcpy(inputA, argv[1]); strcpy(inputB, argv[2]); strcpy(inputC, argv[3]); free(inputC); free(inputB); free(inputA); printf(“execute challenge to win\n”); } 显然,实现对分配的块的元数据的实际覆盖是微不足道的。 但是,我还没有找到使用任何标准技术来利用此代码的方法。 我已阅读并尝试实施以下技术: 论文:关于堆溢出的 w00w00 虽然论文非常清楚,但是unlink技术已经过时了一段时间。 Malloc Maleficarum.txt […]

C实现倾斜堆

我正在尝试在C中实现一个倾斜堆,但我的代码不能编译。 我不是那种经验丰富的C而且从来没有在C中创建任何类型的堆。这就是为什么我不知道如何修复它,我希望有人可以指出我正确的方向。 我一直在读关于倾斜堆的文章,这是我到目前为止使用我在网上找到的算法得到的。 提前致谢。 typedef struct node { int value; struct node * root; struct node * leftchild; struct node * rightchild; } Node; struct skewHeap { struct node * root; }; void skewHeapInit (struct skewHeap * sk) { sk->root = 0; } void skewHeapAdd (struct skewHeap *sk) { struct node *n = (struct node […]

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

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

如何实现内存堆

不确定如何标题,但问题是: 我听说过程序员在程序开始时分配大部分连续内存,然后在必要时将其处理掉。 这与每次需要内存时简单地访问操作系统形成对比。 我听说这会更快,因为它可以避免不断向操作系统询问连续的内存块的成本。 我相信JVM就是这样做的,维护自己的内存部分,然后从中分配对象。 我的问题是,如何实际实现这一点? 谢谢,dragonwrenn

将最大堆转换为二叉搜索树

我们给出了一个2 m – 1个不同的,可比较的元素的数组,从1开始索引。 我们可以将数组视为完整的二叉树: Node is placed at index i. Left child is placed at 2i. Right child is placed at 2i+1. 例如,数组 [7 6 4 5 2 3 1] 是树 7 / \ 6 4 / \ / \ 5 2 3 1 现在,当被视为二叉树时,这些元素满足堆属性,节点大于其子节点: A[i] > A[2i] and A[i] > A[2i+1] 是否存在相当快速的就地算法来重新排列数组的元素,以便生成的二叉树(如上所述)是二叉搜索树? 回想一下,在二叉搜索树中,节点大于其所有左后代,并且少于其所有右后代。 […]

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

我知道这听起来像是一个普遍的问题而且我已经看过很多类似的问题(无论是在这里还是在网上),但它们都不是我的困境。 说我有这个代码: 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上运行了一些测试,执行时间之间几乎没有差异。 但我真的不相信…… 理论上,这种变化应该有所作为吗?

C变量的范围

可能重复: 从函数安全和可移植返回字符串文字地址? C语言中字符串文字的“生命周期” 您好我有点困惑 char *func() { return “Hello”; } 这里“Hello”是字符序列/数组。 它是一个局部变量,一旦函数返回它就必须消失。 那我们怎么能得到正确的价值呢?

如何查找变量是在堆栈还是堆中分配?

偶然发现这个面试问题, 在C中,给定变量x ,如何确定该变量的空间是在堆栈还是堆上分配? (有没有办法以编程方式找到它而不必通过符号表等?并且确定是否在堆栈或堆中分配空间有任何实际意义吗?)