这是Kernighan和Ritchie关于C的书的摘录.它显示了如何实现一个版本malloc.虽然评论很好,但我很难理解它.有人可以解释一下吗?
typedef long Align; /* for alignment to long boundary */
union header { /* block header */
struct {
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
} s;
Align x; /* force alignment of blocks */
};
typedef union header Header;
static Header base; /* empty list to get started */
static Header *freep = NULL; /* start of free list */
/* …Run Code Online (Sandbox Code Playgroud) 我的任务是创建一个为结构动态分配内存的程序.通常我们会用
x=malloc(sizeof(int)*y);
Run Code Online (Sandbox Code Playgroud)
但是,我对结构变量使用什么?我认为不可能这样做
struct st x = malloc(sizeof(struct));
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?谢谢!
考虑两个应用程序:一个(num.1)多次调用malloc(),另一个(num.2)调用malloc()几次.两个应用程序分配相同数量的内存(假设为100MB).
对于哪个应用程序,下一个malloc()调用会更快,#1还是#2?
换句话说:malloc()是否在内存中分配了位置索引?
通常的做法是在malloc()之后检查NULL(是否成功分配内存),有些事情
void *ptr = malloc(10);
if (ptr != NULL) {
// do some thing usefull
} else {
// no memory. safely return/throw ...
}
Run Code Online (Sandbox Code Playgroud)
在内核中启用内存过量使用,是否有可能获得NULL?我应该遵循宗教检查每次分配NULL的做法吗?尽管有积极的过度使用机制(我猜值1),malloc会返回NULL吗?
事实上,Android内核使用内存过量使用(不确定值,很想知道它(过度使用值)及其意义).Android中的一些框架源代码(C/C++)代码(可能是第三方)不会检查NULL,也不会在分配后捕获bad_alloc.我错过了什么吗?
关于过度使用内存,SO中有一些线程,但没有一个解决了我的困惑.
编辑:如果采用积极的过度使用,则不会返回NULL(假设1).当没有可用的物理内存并尝试访问分配的内存(写入分配的内存)时,OOM将终止某个进程并为应用程序分配内存,直到它被依次终止(假设2).在任何一种情况下,我都没有看到任何需要检查NULL(内存被分配或进程被杀死).我的假设是对的吗?
便携性不是这个问题的关注点.
它从来没有发生在我身上,而且我已经编程多年了.
有人能给我一个非平凡程序的例子,其中malloc实际上不起作用吗?
我不是在谈论内存耗尽:我正在寻找一个简单的情况,当你只分配一个由用户给出的绑定大小的内存块时,假设一个整数,导致malloc失败.
我刚开始阅读Brian Kernighan和Dennis Ritchie 的C编程语言,我发现了这句话:
该语言没有定义除静态定义之外的任何存储分配工具以及由函数的局部变量提供的堆栈规则; 没有堆或垃圾收集.
那么这是否意味着它是由于malloc()函数,它从堆中返回一些内存地址,C才能访问堆内存?然后必须malloc用其他语言编写,最有可能是汇编或B?
这可能是一个愚蠢的怀疑,但我必须清除它.谢谢.
我正在学习如何在C中创建动态1D数组.下面的代码尝试执行以下操作:
malloc,创建一个10包含类型值的动态长度数组double.j/100for j = 0, 1,..., 9.然后打印出来.realloc.j/100并再次打印出每个条目.测试:
double* data = (double*)malloc(10*sizeof(double));
for (j=0;j<10;j++)
{
data[j]= ((double)j)/100;
printf("%g, ",data[j]);
}
printf("\n");
data = (double*)realloc(data,11*sizeof(double));
for (j=0;j<11;j++)
{
if (j == 10){ data[j]= ((double)j)/100; }
printf("%g, ",data[j]);
}
free((void*) data);
Run Code Online (Sandbox Code Playgroud)
问题
我编码是对的吗?
教程我发现使用malloc没有放在(double*)前面.例如,
int*指针;
pointer = malloc(2*sizeof(int));
在Visual Studio 2010,Windows 7上,这不能为我编译.错误消息是
void类型的值不能分配给类型的实体
int.
为什么它适用于那些教程而不适合我?我是否正确地猜测这是因为他们使用的编译器会(int*)在我的示例中自动填写它们?
有两种方法可以为数组分配内存,其大小在开始时是未知的.最常见的方式是使用malloc这样的
int * array;
... // when we know the size
array = malloc(size*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
但是在我们知道尺寸后,在C99中定义数组也是有效的.
... // when we know the size
int array[size];
Run Code Online (Sandbox Code Playgroud)
他们完全一样吗?
我目前正在开发一个嵌入式项目(STM32F103RB,CooCox CoIDE v.1.7.6 with arm-none-eabi-gcc 4.8 2013q4),我试图了解当RAM满时如何malloc()表现C.
我的STM32有20kB = 0x5000Bytes的RAM,0x200用于堆栈.
#include <stdlib.h>
#include "stm32f10x.h"
struct list_el {
char weight[1024];
};
typedef struct list_el item;
int main(void)
{
item * curr;
// allocate until RAM is full
do {
curr = (item *)malloc(sizeof(item));
} while (curr != NULL);
// I know, free() is missing. Program is supposed to crash
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一旦堆太小而无法分配,我希望malloc()能够返回NULL:
0x5000(RAM) - 0x83C(bss) - 0x200(堆栈)= 0x45C4(堆) …
我正在尝试从Linux amd64上的gdb中调查C/C++堆的状态,有一个很好的方法吗?
我尝试过的一种方法是"调用mallinfo()"但不幸的是我无法提取我想要的值,因为gdb没有正确处理返回值.
我不能轻易地编写一个函数来编译成我所连接的进程的二进制文件,所以我可以通过这种方式在我自己的代码中调用mallinfo()来实现我自己的函数来提取值.是否有一个聪明的技巧可以让我在飞行中做到这一点?
另一种选择可能是找到堆并遍历malloc头文件/空闲列表; 我非常感谢能够找到这些位置和布局的任何指示.
我一直在尝试谷歌并阅读约2个小时的问题,我已经学到了一些有趣的东西,但仍然找不到我需要的东西.