Tag: 内存管理

C中二维数组的结构 – 如何声明和使用

我一直试图用一个非常简单的想法在C中工作,但我甚至无法理解语法。 该程序将从命令行获取一些输入,并使用它们来决定制作二维结构数组的大小。 然后,在for循环类型的情况下,我希望能够根据用户输入更改特定的unsigned char。 所以首先我构建一个2D结构数组,每个结构包含一个无符号字符数组以及一个名称,然后我就可以写入这些结构。 命令行参数是三个字符串。 First one is number of rows, second one is number of columns, third one is size of unsigned char array within each struct. #include #include #include #include #include typedef struct { unsigned char* Data; char* name; } myStruct; myStruct* myArr[][]; int main(int argc, char *argv[]) { int y = […]

如何查找malloc调用实际消耗了多少内存?

如果我打电话: char *myChar = (char *)malloc(sizeof(char)); 我可能会使用超过1个字节的内存,因为malloc可能会自己使用一些内存来跟踪堆中的空闲块,并且总是可以通过始终沿着某些边界对齐分配来节省一些内存。 我的问题是 :有没有办法找出特定的malloc调用真正耗尽了多少内存,包括有效的对齐成本,以及malloc / free使用的开销? 为了清楚起见,我并没有要求在调用malloc之后找出指针指向的malloc 。 相反,我正在调试一个使用大量内存的程序,我想知道代码的哪些部分正在分配多少内存。 我希望能够使内部记忆会计与top报告的数字非常接近。 理想情况下,我希望能够以per malloc -call为基础以编程方式执行此操作,而不是在检查点获取摘要。

为一个malloc中的元素分配struct和memory

我确信这是一个基本问题,但我无法确定这是否是一个合法的内存分配策略。 我正在读取文件中的数据,我正在填写一个结构。 成员的大小在每次读取时都是可变的,所以我的struct元素就是这样的指针 struct data_channel{ char *chan_name; char *chan_type; char *chan_units; }; 所以在阅读之前我弄清楚每个字符串的大小是什么,所以我可以为它们分配内存我的问题是我可以在一个malloc中为结构和字符串分配内存然后填充指针吗? 假设chan_name的大小是9,chan_type 10和chan_units 5.所以我会分配并执行类似的操作。 struct data_channel *chan; chan = malloc(sizeof(struct data_channel) + 9 + 10 + 5); chan->chan_name = chan[1]; chan->chan_type = chan->chan_name + 9; chan->chan_units = chan->chan_type + 10; 所以我读了几篇关于内存对齐的文章,但我不知道上面的内容是否有问题,或者它可能产生什么样的意外后果。 我已经在我的代码中实现了它,它似乎工作正常。 我只是不想跟踪所有这些指针,因为实际上我的每个结构都有7个元素,而我可以有100个以上的通道。 那当然意味着700个指针加上每个结构的指针总共800个。我还必须设计一种方法来释放它们。 我还想将这个策略应用于字符串数组,然后我需要有一个指针数组。 我现在没有任何结构混合数据类型可能是一个问题,但我可能会成为一个问题?

C程序,指针参数不会保存值

嗨伙计们,我很抱歉打扰你,但我开始在这里松开它..我最近再次开始用C编程,我遇到了一些我无法弄清楚的错误..我的C程序是(应该)是一个简单的程序,因此它需要执行以下操作:从键盘读取未定义数量的自然元素,直到读取0。 之后,它必须计算所有元素的乘积,并在该结果的末尾计算0-s的数量。 int input(int* v) { int n = 0; do { n = n + 1; v = (int*) realloc(v,n*sizeof(int)); printf(“Enter number %d: “,n); scanf(“%d”,&v[n-1]); } while(v[n-1] != 0); n–; return n; } int tZeros(int* v, int eNb) { int i; int val = 1; for(i = 0; i 0) { int zeros = […]

为什么mstats和malloc_zone_statistics在免费后没有显示恢复的内存?

我正在尝试编写一些unit testing来检查内存是否已被释放 – 以检查内存泄漏 – 在OS X(10.9 Mavericks)上。 我正在尝试使用mstats()和malloc_zone_statistics()来发现我需要的信息。 但似乎他们没有显示内存被释放(参见下面的示例输出…在调用free()后内存使用率不会改变) 我怀疑这与堆管理有关,而不是与这些函数的问题有关。 我认为堆不释放释放的内存,也许它可以重用它而不需要删除和添加块的开销。 有没有办法告诉堆释放释放的块? 要更积极还是关闭优化? 我只是错误地使用mstats()或malloc_zone_statistics()吗? 更新:找到的解决方案……在底部提供…… 这是我的测试程序的输出: === Initial conditions === in use: 23584, allocated: 9437184, blocks: 320 SimpleLeaker(19583,0x7fff7b2a2310) malloc: total: 9437184, used: 23584, free: 9413600 === Before allocation === in use: 23584, allocated: 9437184, blocks: 320 SimpleLeaker(19583,0x7fff7b2a2310) malloc: total: 9437184, used: 23584, free: 9413600 […]

静态C字符串分配问题

请考虑以下代码: char* str = “Hello World”; memcpy(str, “Copy\0”, 5); memcpy期间发生分段错误。 但是,使用此代码: char str[12]; memcpy(str, “Hello World\0”, 12); memcpy(str, “Copy\0”, 5); 该程序不会产生分段错误。 问题来自于在堆栈上分配内存而不是数据部分吗?

存储指针值

据我所知,当一个指针传递给一个函数时,它只是一个真实指针的副本。 现在,我想要更改真正的指针,而不必从函数返回指针。 例如: int *ptr; void allocateMemory(int *pointer) { pointer = malloc(sizeof(int)); } allocateMemory(ptr); 另一件事,就是我如何将内存分配给2个或更多维数组呢? 不是通过下标,而是通过指针算术。 这是: int array[2][3]; array[2][1] = 10; 同样如下: int **array; *(*(array+2)+1) = 10 另外,为什么我必须传入指向函数的指针的内存地址,而不是实际的指针本身。 例如: int * a; 为什么不: allocateMemory(*a) 但 allocateMemory(a) 我知道我总是要这样做,但我真的不明白为什么。 请向我解释。 最后一件事是,在这样的指针中: int *a; 是包含实际值的内存地址,还是指针的内存地址? 我一直认为a是它指向的实际值的内存地址,但我不确定。 顺便说一下,当打印这样的指针时: printf(“Is this address of integer it is pointing to?%p\n”,a); printf(“Is […]

char * str; STR =“HELLO”; 如果没有为字符串分配任何内存,它如何工作?

码: #include int main() { char *str; char i = ‘a’; str = &i; str = “Hello”; printf(“%s, %c, %x, %x”, str, i, str, &i); return 0; } 我得到这个输出: Hello, a, 403064, 28ff0b 我有两个疑问: 如何在不为其分配任何内存的情况下存储字符串。 str是一个字符指针,指向char变量i 。 当我添加str = “Hello”; 我不是使用该位置的5个字节,其中4未分配? 因为,我编码str = &i; 当我打印它们时,不应该str和&i具有相同的值吗? 当我删除str = “Hello”; 语句str和&i是一样的。 如果str和&i相同,那么我相信当我说str = “Hello”它应该用’H’覆盖’a’ ‘H’而其余’ello\0’进入后续字节。 我相信整个问题是str = […]

需要一个工具来检测C代码中的内存泄漏

是否有一个很好的应用程序(有某种gui)来测试c代码中的内存泄漏。 我真的想测试我的作业/程序,但对此非常新,我很难使用终端来做事情,特别是使用gdb进行调试(对我而言,感觉就像过去的爆炸,我可以使用一些可视调试器)。 谢谢您的帮助 编辑:平台没关系 – 我正在运行一切;)

内存泄漏使用JSON-C

我是JSON-C的新手,请查看我的示例代码,让我知道它会创建任何内存泄漏,如果是,那么如何释放JSON-C对象。 struct json_object *new_obj = NULL; new_obj = json_tokener_parse(strRawJSON); new_obj = json_object_object_get(new_obj, “FUU”); if(NULL == new_obj){ SYS_OUT(“\nFUU not found in JSON”); return NO; } new_obj = json_object_object_get(new_obj, “FOO”); // I m re-using new_obj, without free it? if(NULL == new_obj){ SYS_OUT(“\nFOO not found in JSON”); return NO; } // DO I need to clean new_obj, if […]