Tag: malloc

C – malloc和数组混淆

我试图掌握C中的malloc函数,并编写了以下代码: int i; int *arr = (int*)malloc(5*sizeof(int)); if(arr==NULL){ printf(“Failed to allocate memory for arr…\n”); exit(1); } 我认为这意味着只有5个元素可以添加到数组中。 为了测试这是否属实,我添加了以下代码: arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5; arr[5] = 6; arr[6] = 7; arr[7] = 8; arr[8] = 9; for(i=0;i<9;i++){ printf("%d\n",arr[i]); } 令人惊讶的是,该代码编译并运行完美。 怎么可能?

如何释放函数返回的指针?

#include #include #include char* f(void) { char *x; x = malloc(sizeof(char) * 4); strcpy(x, “abc”); return(x); } int main(void) { char *a; a = f(); printf(“%s”, a); free(a); return(0); } 是否必须释放函数中的变量x ? 如果是这样,当我需要退货时,这怎么可能呢?

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 = […]

如果大小为0,可以使用空指针调用memset()吗?

出于这样或那样的原因,我想手动滚动一个归零版本的malloc() 。 为了最大限度地减少算法的复杂性,我想写: void * my_calloc(size_t size) { return memset(malloc(size), 0, size); } 当size == 0时这个定义得很好吗? 调用malloc()的大小为零,但允许它返回空指针。 memset的后续调用是否可以,或者这是未定义的行为,我需要添加条件if (size) ? 我非常想避免多余的条件检查! 假设目前malloc()没有失败。 实际上,那里也会有一个手动推出的malloc()版本,它将在失败时终止。 像这样的东西: void * my_malloc(size_t size) { void * const p = malloc(size); if (p || 0 == size) return p; terminate(); }

如何查找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个。我还必须设计一种方法来释放它们。 我还想将这个策略应用于字符串数组,然后我需要有一个指针数组。 我现在没有任何结构混合数据类型可能是一个问题,但我可能会成为一个问题?

神秘的malloc:sysmalloc:断言失败错误

我收到一个神秘的错误,我不明白为什么。 此代码在失败之前运行多次,并且始终在同一点失败。 这是我的代码: assert(size > 0); int* sorted = malloc(size * sizeof(int)); 这是我运行时遇到的错误: malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) – 1) * 2])) – __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) – 1)) & ~((2 * (sizeof(size_t))) – 1))) […]

在C中更有效地使用strncpy复制n个字符

我想知道考虑到最大量的字符,是否有更干净,更有效的方法来执行以下strncpy 。 我觉得自己太过分了。 int main(void) { char *string = “hello world foo!”; int max = 5; char *str = malloc (max + 1); if (str == NULL) return 1; if (string) { int len = strlen (string); if (len > max) { strncpy (str, string, max); str[max] = ‘\0’; } else { strncpy (str, string, […]

malloc()的奇怪行为

试着理解我的问题的答案 尝试释放堆管理器分配的内存时会发生什么,分配的内容超过了要求? 我写了这个函数,并对其输出感到困惑 int main(int argc,char **argv){ char *p,*q; p=malloc(1); strcpy(p,”01234556789abcdefghijklmnopqrstuvwxyz”); //since malloc allocates atleast 1 byte q=malloc(2); // free(q); printf(“q=%s\n”,q); printf(“p=%s\n”,p); return 0; } 产量 q=vwxyz p=01234556789abcdefghijklm! 任何人都可以解释这种行为吗? 或者这个实现是否具体? 如果free(q)被取消注释,我也会收到SIGABRT。

realloc里面的realloc

在C中,你可以在realloc里面重新分配吗? 例如,当你需要对它们两者进行malloc并重新分配它们时,结构中的结构。 如果是,有人可以提供一个简单的例子吗? 先感谢您。