Tag: 内存

如果malloc失败怎么办?

如果malloc分配失败,我们应该再试一次吗? 在这样的事情: char* mystrdup(const char *s) { char *ab = NULL; while(ab == NULL) { ab=(char*)malloc(strlen(s)+1); } strcpy(ab, s); return ab; } while循环对检查内存分配有效吗?

如何用指针向另一个结构释放结构的记忆

我有两个结构 struct SimpleXY { double x; double y; }; struct SimpleXyLink { int num_xy; SimpleXY *simpleXyList; }; 我想知道SimplyXyLink释放内存的正确方法是什么? 我目前正在使用 void Free(SimpleXyLink *myList) { free(myList->simpleXyList); } 但我认为这是错误的,因为它不会释放simpleXyList元素内的内存。

为什么需要内存对齐?

可能重复: 记忆对齐的目的 我在网上阅读了一些关于内存对齐的文章,并且可以理解,通过正确对齐的内存(采用2字节对齐),我们可以一次性快速获取数据。 但是如果我们有像一个硬件一样的内存,那么给定一个地址,为什么我们不能直接从该位置读取2字节。 喜欢: 我考虑过它。 我认为,如果记忆在奇偶组中,那么理论就适用了。 我错过了什么?

程序如何在内存中运行以及操作系统处理内存的方式

当进程在运行时执行时,我不清楚内存管理 这是一张图 我不清楚图像中的以下内容: 1)这个图像所指的堆栈是什么? 2)什么是内存映射段,它指的是文件映射? 3)堆与进程有什么关系。 堆只是在进程中处理还是由操作系统内核维护的堆,然后当用户空间应用程序调用时,malloc(使用堆)分配内存空间? 文章提到了http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/ 虚拟地址空间,在32位模式下始终是4GB的内存地址块。 这些虚拟地址按页表映射到物理内存, 4)这是否意味着一次只有一个程序在内存中运行占用整个4 GB的RAM? 同一篇文章也提到了 Linux通过向起始地址添加偏移量来随机化堆栈,内存映射段和堆。 不幸的是,32位地址空间非常紧张,几乎没有随机化空间并妨碍其有效性。 5)它是指在一个进程中随机化堆栈还是指在计算所有进程的空间后留下的东西?

alloc,malloc和alloca – 有什么区别?

我的印象是Objective-C中的alloc (当我们调用[anyObject alloc]实际上是在实现C函数malloc并且内存在堆中分配,但无法找到答案)。 此外,在搜索alloc ,我发现alloca在堆栈中分配内存。 如果我没有错, alloc在堆中分配内存来创建对象。 那么, alloc和malloc (和alloca )有什么区别? 任何人都可以总结一下吗?

如何在C中编写线程安全,高效,无锁的内存分配器?

如何在C中编写线程安全,高效,无锁的内存分配器? 我的意思是: 快速分配和解除分配 最佳内存使用(最小浪费和无外部碎片) 最小的元数据开销

链接器脚本 – 将一个部分放在内存区域的末尾

我已经广泛搜索了如何做到这一点并未能得出答案。 我的内存布局如下: Fake Address | Section 0 | text 7 | relocate 15 | bss 23 | stack 在堆栈的末尾我放置堆。 它正在成长,堆栈是我正在使用的ARM芯片的完全下降堆栈。 现在,我想要做的是放置一个部分,让我们称之为.persist ,进入我的ram内存。 我希望它驻留在RAM的最后,我想将其编程到我的链接器脚本中。 但是,此.persist部分的大小不是由我定义的,而是由编译器根据它包含的符号计算的。 到目前为止,我还没有想出一个好办法。 因为我知道RAM起始地址和SIZE,如果我知道部分大小,那么计算部分需要去的位置是微不足道的。 但是,根据GNU链接器文档(第74页),它似乎是: SIZEOF(section)如果已分配该部分,则返回指定部分的大小(以字节为单位)。 如果在评估此部分时尚未分配该部分,则链接器将报告错误。 所以我无法计算出链接器脚本中该部分的大小(因为我想在放置它/分配之前计算大小)。 有谁知道这样做的好方法?

使用C中的字符指针为结构分配内存

我今天很难修复代码,然后我遇到类似的东西: typedef struct { int a; int b; int c; int d; char* word; } mystruct; int main(int argc, char **argv){ mystruct* structptr = malloc(sizeof(mystruct)); if (structptr==NULL) { printf(“ERROR!”) … } … free(structptr); return 0; } 由于char* word是一个可变长度的字符串,而且malloc没有为它分配足够的内存,因此代码提供了大量的内存错误。 实际上它只为整个struct分配了20 Bytes 。 有没有解决这个问题的方法,而不是将char*变成像char word[50] ?

不同的字符串如何具有相同的地址

我知道为了比较C中的两个字符串,你需要使用strcmp()函数。 但我试着用==运算符比较两个字符串,它有效。 我不知道如何,因为它只是比较两个字符串的地址。 如果字符串不同,它应该不起作用。 但后来我打印了字符串的地址: #include #include int main() { char* str1 = “First”; char* str2 = “Second”; char* str3 = “First”; printf(“%p %p %p”, str1, str2, str3); return 0; } 输出是: 00403024 0040302A 00403024 Process returned 0 (0x0) execution time : 0.109 s Press any key to continue. str1和str3有多少可能具有相同的地址? 它们可能包含相同的字符串,但它们不是同一个变量。

将队列设计为共享内存

我正在尝试将(循环)队列(在C中)设计/实现为共享内存,以便可以在多个线程/进程之间共享它。 队列结构如下: typedef struct _q { int q_size; int q_front; int q_rear; int *q_data; }queue; 它支持以下function: int empty_q(queue *q); int display_q(queue *q); int create_q(queue **q, int size); int delete_q(queue **q); int enqueue(queue *q, int data); int dequeue(queue *q, int *data); 根据用户提到的队列大小,q_data的内存将在create_q()中分配。 问题:如何使用“sys / shm.h”中提供的系统函数为此队列创建共享内存? 使用shmget(),shmat(),shmctl()等创建/附加/检索/删除队列数据结构的共享内存的任何代码片段/示例都将是一个很好的帮助。