Tag: malloc

退出前我应该释放内存吗?

因错误而退出程序时,我应该释放所有我的mallocated内存吗? something = (char**) malloc (x * sizeof(char*)); for (i = 0; i < x; i++) something[i] = (char*) malloc (y + 1); … if (anything == NULL) { printf("Your input is wrong!"); // should I free memory of every mallocated entity now? exit(1); } else { // work with mallocated entities … free(something); // […]

动态分配矩阵的function

我想创建一个函数来分配(使用malloc / calloc )一个声明为双指针的矩阵。 我理解双指针矩阵如何工作以及如何使用malloc分配它,但是当我传递我的矩阵(在main()声明并初始化为NULL )时,我的程序崩溃了。 我想错误是我的allocMatrix()函数,因为如果我在main分配矩阵,所有工作都顺利进行。 谢谢 :-) 主要: #include #include #include “Data.h” #define ROW 5 #define COL 5 int main(void) { int i,j, ret; int nRow, nCol; int **mat=NULL; // double pointer matrix nRow = 0; nCol = 0; //Insert n of row and columns printf(“Insert n of rows and columns:\n”); scanf(“%d %d”, […]

malloc实现?

我正在尝试为C实现malloc和free ,我不知道如何重用内存。 我目前有一个如下所示的struct : typedef struct _mem_dictionary { void *addr; size_t size; int freed; } mem_dictionary; 我的malloc看起来像这样: void *malloc(size_t size) { void *return_ptr = sbrk(size); if (dictionary == NULL) dictionary = sbrk(1024 * sizeof(mem_dictionary)); dictionary[dictionary_ct].addr = return_ptr; dictionary[dictionary_ct].size = size; dictionary[dictionary_ct].freed = 1; dictionary_ct++; return return_ptr; } 当我释放内存时,我只会将地址标记为0 (这表示它是免费的)。 在我的malloc ,我会使用for循环来查找数组中的任何值等于0 ,然后将内存分配给该地址。 我有点困惑如何实现这一点。

通过malloc进行VLA和动态内存分配有什么区别?

我很好奇这个: 有什么不同之处: const int MAX_BUF = 1000; char* Buffer = malloc(MAX_BUF); 和: char Buffer[MAX_BUF];

我们为什么要转换malloc的返回值?

有人可以向我解释为什么有些程序员在malloc前使用(char *)? 我知道它返回void但为什么我要它只返回char内存? 对不起,我只是编程新手。 谢谢

为什么故意不正确地使用strcpy不会失败呢?

为什么使用strcpy的下面的C代码对我来说效果很好? 我尝试以两种方式使其失败: 1)我尝试从字符串文字strcpy到分配的内存太小,不能包含它。 它复制了整个事情并没有抱怨。 2)我从一个非NUL -terminated的数组中尝试了strcpy 。 strcpy和printf工作得很好。 我曾经以为strcpy复制了char直到找到NUL ,但没有一个存在且仍然停止。 为什么不这些失败? 我是以某种方式获得“幸运”,还是我误解了这个function是如何工作的? 它是特定于我的平台(OS X Lion),还是大多数现代平台以这种方式工作? #include #include #include int main() { char *src1 = “123456789”; char *dst1 = (char *)malloc( 5 ); char src2[5] = {‘h’,’e’,’l’,’l’,’o’}; char *dst2 = (char *)malloc( 6 ); printf(“src1: %s\n”, src1); strcpy(dst1, src1); printf(“dst1: %s\n”, dst1); strcpy(dst2, src2); printf(“src2: %s\n”, […]

如果我尝试访问malloc()区域以外的内存会发生什么?

我用char* memoryChunk = malloc ( 80* sizeof(char) + 1);分配了一个内存char* memoryChunk = malloc ( 80* sizeof(char) + 1); 是什么阻止我写入超过81个单元的内存位置? 我该怎么做才能防止这种情况发生? void testStage2(void) { char c_str1[20] = “hello”; char* ut_str1; char* ut_str2; printf(“Starting stage 2 tests\n”); strcat(c_str1, ” world”); printf(“%s\n”, c_str1); // nothing exciting, prints “hello world” ut_str1 = utstrdup(“hello “); ut_str1 = utstrrealloc(ut_str1, 20); utstrcat(ut_str1, c_str1); […]

如何在malloc之后获取内存块长度?

我以为我无法检索分配的内存块的长度,就像Java中的简单.length函数一样。 但是,我现在知道当malloc()分配块时,它会分配额外的字节来保存包含块大小的整数。 该整数位于块的开头; 实际返回给调用者的地址指向刚超过此长度值的位置。 问题是,我无法访问该地址来检索块长度。 #include #include int main(void) { char *str; str = (char*) malloc(sizeof(char)*1000); int *length; length = str-4; /*because on 32 bit system, an int is 4 bytes long*/ printf(“Length of str:%d\n”, *length); free(str); } **编辑:我终于做到了。 问题是,它持续给出0作为长度而不是我的系统上的大小是因为我的Ubuntu是64位。 我将str-4更改为str-8,现在可以正常工作了。 如果我将大小更改为2000,则会生成2017年的长度。 但是,当我改为3000时,它会给出3009.我正在使用GCC。

关于malloc和sizeof的新手问题

有人可以向我解释为什么我对字符串大小为6的malloc的调用返回4字节的sizeof? 事实上,我给malloc的任何整数参数我得到sizeof为4.接下来,我试图复制两个字符串。 为什么我复制的字符串输出(NULL)? 以下是我的代码: int main() { char * str = “string”; char * copy = malloc(sizeof(str) + 1); printf(“bytes allocated for copy: %d\n”, sizeof(copy)); while(*str != ‘\0’){ *copy = *str; str++; copy++; } copy = ‘\0’; printf(“%s\n”, copy); }

检查指针是否指向堆上已分配的内存

我想知道指针是否指向一个用malloc / new分配的内存。 我意识到任意地址的答案是“不,你不能”,但我认为可以覆盖malloc / free并跟踪分配的内存范围。 您是否知道提供此特定工具的内存管理库? 你知道生产代码的东西吗? Valgrind很棒,但是仪表太多了(慢)并且Will说我们不想像这样使用Valgrind(使软碰撞变得足够好)。 Mudflap是一个非常好的解决方案,但是专门用于GCC,遗憾的是,检查不会简单地返回布尔值(请参阅下面的答案)。 请注意,检查内存写入是否合法是一个安全问题 。 所以寻找表现是有动力的。