Tag: 内存

动态分配C结构?

我想动态分配一个C结构: typedef struct { short *offset; char *values; } swc; ‘offset’和’values’都应该是数组,但是它们的大小在运行时才会被识别。 如何为我的struct和struct的数组动态分配内存?

如何在预先分配的内存上指向2D / 3D空间

我内存优化了我用于嵌入式使用的代码。 它运行良好,但结果是我获得了大量的1D,2D和3D mallocs,并在函数中间释放,从而减慢了执行时间。 出于几个原因,我决定修改我的方式。 我想在执行开始时用一个malloc分配所有可用的内存,并指出每个数组需要的正确内存空间。 有关信息,我现在在x86上执行此操作,所以我没有任何内存空间问题。 我用这种方式声明我的数组: unsigned char *memory; memory = (unsigned char *)malloc(MYSIZE*sizeof(unsigned char)); type* p1; p1 = (type *)((int)memory + p1_offset); type** p2; p2 = (type **)((int)memory + p2_offset); for (int i=0 ; i<p2_height ; i++) { p2[i] = (type *)((int)p2 + p2_width*sizeof(type)); } 虽然它适用于我的1D指针,但它为我的2D指针声明返回了一个段错误。 我检查了我的偏移量,它们与内存指针相比很好。 由于我没有经验这种方式来宣布我的指针,也许我在这里误解了一些东西,所以如果有人可以向我解释更多关于这种技术的话,我会很高兴!

释放已分配给char指针(字符串)数组的内存。 我是否必须释放每个字符串或只是“主”指针?

我有一个函数,它接受一个指向char **的指针并用字符串填充它(我想是一个字符串数组)。 * list_of_strings *在函数内部分配内存。 char * *list_of_strings = NULL; /* list_of_strings malloc’d inside function */ fill_strings_with_stuff(&list_of strings); use_list_for_something(list_of_strings); /* Now how do I free it all? */ 在使用弦乐后,我将如何释放内存? 如果我打电话 free(list_of_strings); 不会只是释放实际的指针而不是每个字符串本身使用的内存吗? 我如何完全释放内存 为了清楚起见,该函数看起来像这样: fill_strings_with_stuff(char *** list) { *list = malloc(AMOUNT); for (i = 0; i < SOMETHING; i++) { *(list + i) = malloc(LINE_LEN); […]

strtok和内存泄漏

我用strtok()写了一个简单的url解析器。 这是代码 #include #include typedef struct { char *protocol; char *host; int port; char *path; } aUrl; void parse_url(char *url, aUrl *ret) { printf(“Parsing %s\n”, url); char *tmp = (char *)_strdup(url); //char *protocol, *host, *port, *path; int len = 0; // protocol agora eh por exemplo http: ou https: ret->protocol = (char *) strtok(tmp, “/”); […]

C:将二进制文件读取到内存,更改缓冲区,将缓冲区写入文件

目标:用二进制数据打开文件,将整个文件读入内存,更改文件的某些部分,将内存缓冲区写入文件,关闭文件。 利润? 问题:我刚刚开始学习C,我找不到有关如何更改内存缓冲区中的二进制数据的足够信息。 来自Web开发人员背景(php,python,as3)这对我来说是一个新的领域。 上下文:我有一个函数,它接受文件的路径和指针地址到char指针的内存缓冲区。 然后它打开文件,遍历文件并将数据写入内存缓冲区。 最后关闭文件。 二进制文件的目的是为某些对象保存category-id,它们的位置是它们自己的id。 category-id表示为2字节短路。 所以基本上它只是一个二进制文件,里面装满了很多我希望能够阅读和更改的短裤。 这是我到目前为止所得到的: main.c中: #include “binary-handler.h” void showFileBuffer(char *buffer, unsigned int fileSize){ int i = 0; for(; i < fileSize; ++i){ printf("\n”, i, ((char *)buffer)[i]); } } int main(){ char path[] = “assets/map-squares.bin”; char *buffer; int fileSize; fileSize = readFileToMemory(path, &buffer); showFileBuffer(buffer, fileSize); //Code to change buffer […]

堆内存分配

如果我使用malloc()在我的程序中动态分配内存但是我没有在程序运行时释放内存,那么在程序终止后是否会释放动态分配的内存? 或者如果它没有被释放,并且我一遍又一遍地执行相同的程序,它每次都会分配不同的内存块吗? 如果是这样的话,我应该如何释放这段记忆? 注意:我能想到的一个答案是重新启动我正在执行程序的机器。 但是,如果我在远程计算机上执行程序并且重启不是一个选项?

我们可以为给定的内存位置分配值吗?

我想将一些值(比如2345)分配给一个内存位置(比如说0X12AED567)。 可以这样做吗? 换句话说,我该如何实现以下function? void AssignValToPointer(uint32_t pointer, int value) { }

用于测试C和C ++分配器的基准测试?

请建议用于测试C和C ++分配器的基准测试? 满足以下任何方面的基准被认为: 速度 碎片 并发 谢谢!

C(++)对未存储在变量中的值有什么作用?

我对C和C ++如何处理未存储在变量中的数据感到有点好奇,例如: int IE6_Bugs = 12345; int Win_Bugs = 56789; 是的 – 一切都很清楚。 IE6_Bugs有123456存储在它的特定内存地址。 那怎么样.. if ( IE6_Bugs + Win_Bugs > 10000 ) { // … 因此,C抓取两个变量的值并添加它们,以便将结果与右侧的int进行比较。 但: IE6_Bugs+Win_Bugs到达RAM吗? 或者处理器是否通过自己的缓存直接比较值? 或者,在编译过程中,上面的if语句转换为机器更“可理解”的东西? (也许首先计算IE6_Bugs+Win_Bugs并将其存储在某个变量中,……)

使用现代编译器在C ++中使用“memset”function的状态

语境: 不久之前,我偶然发现了Alexandrescu撰写的2001年DDJ文章: http : //www.ddj.com/cpp/184403799 它是关于比较各种方法来初始化缓冲区到某个值。 就像“memset”对单字节值的作用一样。 他比较了各种实现(memcpy,显式“for”循环,duff的设备),并没有真正找到所有数据集大小和所有编译器的最佳候选者。 引用: 所有这一切都有一个非常深刻和悲伤的认识。 我们是在2001年,即Space Odyssey的一年。 (…)只需跳出框架看看我们 – 50年后,我们仍然不擅长填充和复制记忆。 题: 有没有人有关于这个问题的最新信息? 最近的GCC和Visual C ++实现是否比7年前表现更好? 我正在编写具有5年(可能超过10年)的生命周期的代码,并且将处理数组的大小从几个字节到几百兆字节。 我不能假设我现在的选择在5年内仍然是最优的。 我该怎么办: a)使用系统的memset(或等效的)并忘记最佳性能或假设运行时和编译器将为我处理这个问题。 b)在各种数组大小和编译器上一劳永逸地进行基准测试,并在几个例程之间在运行时切换。 c)在程序初始化时运行基准测试,并在运行时根据准确的(?)数据进行切换。 编辑:我正在研究图像处理软件。 我的数组项目是POD,每毫秒都很重要! 编辑2:感谢您的第一个答案,这里有一些额外的信息: 缓冲区初始化可能占某些算法总运行时间的20%-40%。 该平台可能在未来5年内有所不同,尽管它将保持“最快的CPU资金可以从DELL购买”类别。 编译器将是某种forms的GCC和Visual C ++。 雷达上没有嵌入式东西或异国情调的架构 我想听听那些在MMX和SSE出现时不得不更新软件的人,因为当“SSE2015”可用时我将不得不这样做…… 🙂