Tag: 内存

在C中将内存分配给char ***

所以,我在为char ***类型变量分配内存时遇到了麻烦。 我的目标是创建一个字符串矩阵,我目前用于内存分配的代码如下: char ***matrix; matrix = calloc(n*MAX_STR, sizeof(char**)); for(z = 0; z < n; z++) { matrix[z] = calloc(n, sizeof(char*)); for(i = 0; i < MAX_STR; i++) { matrix[z][i] = calloc(MAX_STR, sizeof(char)); } } 我已成功为字符串数组分配内存,使用: char **list; list = calloc(n, sizeof(char *)); for (j = 0; j < n; j++){ list[j] = calloc(MAX_STR, sizeof(char)); […]

结构的内存大小不同?

为什么第一种情况下不是12? 测试:最新版本的gcc和clang,64位Linux struct desc { int** parts; int nr; }; sizeof(desc); Output: 16 struct desc { int** parts; }; sizeof(desc); Output: 8 struct desc { int nr; }; sizeof(desc); Output: 4

malloc(sizeof(int))vs malloc(sizeof(int *))vs(int *)malloc(sizeof(int))

我承认所有这三个都有不同的含义。 但是,我不明白每种情况适用于哪些特定情况。 任何人都可以分享这些例子吗? 谢谢。 malloc(sizeof(int)) malloc(sizeof(int *)) (int *)malloc(sizeof(int))

C.分段function修改动态分配的2d数组时的错误

我需要的是一个函数,修改给定指针2d矩阵,如下所示: void intMatrixAll(int row, int col, int **matrix); 现在,函数应该分配内存并且可以使用矩阵。 行和列在运行时给出。 #include #include #define PRINTINT(X) printf(“%d\n”, X); void intMatrixAll(int row, int col, int **matrix); int main(void) { int testArrRow = 4; int testArrCol = 6; int **testMatrix = NULL; intMatrixAll(testArrRow, testArrCol, testMatrix); testMatrix[2][2] = 112; //sementation fault here 🙁 PRINTINT(testMatrix[2][2]); system(“PAUSE”); return 0; } void intMatrixAll(int […]

数组如何在c / c ++中内部工作

我想知道数组如何在c中工作。 我最终得出一个假设,我想知道我是否正确。 我们知道数组是一系列相邻的内存盒(盒子),其中每个盒子的大小都是它所存储的类型(即如果INT的一个盒子的大小= sizeof(int),则一个3个INT的数组占用内存相邻的位置3 sizeof(int)) 现在我们也知道我们可以为某种类型的数组动态分配内存(C中的malloc,C ++中的new)。 让我想知道的是,当使用括号[0]调用数组时,一个数组的原点是数组的第一个框的地址和第一个值(后面的框中的值)是数组[0] = = *(数组+ 0)== *数组(数组是否被声明为“type * array”或“type array []”或“type array [size]”)和“数组”这样称为无论是定义为指针还是数组(“type * array”或“type array []”或“type array [size]”)是第一个框的地址。 我最后想了想,我想对此进行确认:数组甚至用方括号([]声明)实际上在内存中是一系列n个指针,每个指针包含(作为一个值而不是地址)的地址一个存储盒Bi,包含实际值+那些存储盒(B0,…,Bn,每个包含实际值)。 这样,当一个人声明“int array [5]”时,该程序实际上分配了5个相邻的int指针盒P0,P1,…,P4和5个整个计算机存储器B0,B1,…的整个大小的存储器位置。 ..,B4,其中Pi的值是Bi的地址 我是对还是错!! 谢谢!

Malloc vs自定义分配器:Malloc有很多开销。 为什么?

我有一个图像压缩应用程序,现在有两个不同版本的内存分配系统。 在最初的一个中,malloc在任何地方都使用,在第二个中,我实现了一个简单的池分配器,它只分配一块内存并将部分内存返回给myalloc()调用。 当使用malloc时,我们注意到了巨大的内存开销:在内存使用的高度,malloc()代码对于1920x1080x16bpp映像需要大约170兆字节的内存,而池分配器仅分配48兆字节,其中47由程序使用。 在内存分配模式方面,程序为测试映像分配了大量8字节(大多数),32字节(许多)和1080字节块(一些)。 除此之外,代码中没有动态内存分配。 测试系统的操作系统是Windows 7(64位)。 我们如何测试内存使用情况? 使用自定义分配器,我们可以看到使用了多少内存,因为所有malloc调用都被赋予分配器。 使用malloc(),在调试模式下,我们只需逐步执行代码并在任务管理器中查看内存使用情况。 在发布模式下我们也做了同样的事情,但由于编译器优化了很多东西,所以我们无法逐步完成代码(发布和调试之间的内存差异大约为20MB,我将其归因于在发布模式下优化和缺少调试信息)。 可以单独使用malloc是导致如此巨大开销的原因吗? 如果是这样,究竟是什么原因导致malloc内部的开销?

如何在C中实现只读内存?

我在C听说过,如果我这样做的话 char *s = “hello world”. “hello world”实际上存储在只读存储器中。 我不太清楚只读内存。 解释是什么? 这是否像编译器的标志,告诉编译器不写入该部分?

C:指向结构指针数组的指针(分配/释放问题)

我已经回到了C的某些东西,但是我很难记住这个内存管理的工作原理。 我想要一个指向结构指针数组的指针。 说我有: struct Test { int data; }; 那么数组: struct Test **array1; 它是否正确? 我的问题是处理这件事。 因此,数组中的每个指针都指向单独分配的内容。 但我认为我需要先做到这一点: array1 = malloc(MAX * sizeof(struct Test *)); 我无法理解上述内容。 我需要这样做,为什么我需要这样做? 特别是,如果我要为指针指向的每个东西分配内存,为指针分配内存意味着什么? 现在说我有一个指向结构指针数组的指针。 我现在希望它指向我之前创建的相同数组。 struct Test **array2; 我是否需要像上面那样为指针分配空间,或者我可以这样做: array2 = array1

快速检查字符数组是否为零的方法

我在内存中有一个字节数组。 查看数组中所有字节是否为零的最快方法是什么?

在C中的每次错误检查后如何避免长链的免费(或删除)?

假设我非常防御地编写代码,并且总是检查我调用的所有函数的返回类型。 所以我喜欢: char* function() { char* mem = get_memory(100); // first allocation if (!mem) return NULL; struct binder* b = get_binder(‘regular binder’); // second allocation if (!b) { free(mem); return NULL; } struct file* f = mk_file(); // third allocation if (!f) { free(mem); free_binder(b); return NULL; } // … } 注意free()事物失控的速度有多快。 如果某些function失败,我必须先释放每一个分配。 代码很快变得丑陋,我所做的就是将所有内容复制粘贴。 我成为了一个复制/粘贴程序员,更糟糕的是,如果有人在其间添加一个声明,他必须修改下面的所有代码来调用free()来添加它。 […]