Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分配适当的内存大小_C_Memory Management_Sizeof_Sbrk - Fatal编程技术网

C 分配适当的内存大小

C 分配适当的内存大小,c,memory-management,sizeof,sbrk,C,Memory Management,Sizeof,Sbrk,我在程序中分配正确大小的内存时遇到问题。我做了以下工作: void * ptr = sbrk(sizeof(void *)+sizeof(unsigned int)); 当我这样做时,我认为这是在向堆中添加太多内存,因为它是以void*而不是字节为单位分配内存的。我如何告诉它我希望sizeof(whatever)表示任何字节,而不是任何其他单位 编辑: 我见过其他人将事物转换为字符,以便编译器采用字节大小。如果sizeof(unsigned int)是4个字节,但我使用的类型是void*,编译

我在程序中分配正确大小的内存时遇到问题。我做了以下工作:

void * ptr = sbrk(sizeof(void *)+sizeof(unsigned int));
当我这样做时,我认为这是在向堆中添加太多内存,因为它是以void*而不是字节为单位分配内存的。我如何告诉它我希望sizeof(whatever)表示任何字节,而不是任何其他单位

编辑:


我见过其他人将事物转换为字符,以便编译器采用字节大小。如果sizeof(unsigned int)是4个字节,但我使用的类型是void*,编译器会将void*的大小从4个字节改为4倍吗?

将字节数作为
sbrk
的参数传递

在Linux中,
sbrk
的原型是:

void *sbrk(intptr_t increment);

sbrk()按增量字节递增程序的数据空间


但是,正如一些人在评论中所说,如果您想动态分配内存,您需要的是
malloc
函数,而不是
sbrk
brk
sbrk
是通常在内部用于实现
malloc
用户功能的系统调用

内核以页面粒度管理进程内存。这意味着进程地址空间必须增加(或缩小)整页数。

因此,即使
sbrk
获得了一定数量的字节,它也会向流程中至少添加一个页面。

您能否澄清一下为什么要在这里添加
sizeof(void*)
?你打算用这些记忆做什么?还有,有什么理由不在这里使用普通的ol'
malloc
?简单回答:要么你知道你在做什么,你不需要问这个问题,要么你不知道你在做什么,你不应该使用
sbrk()
,而是
malloc()
。我之所以避免使用malloc,是因为我正在试验一些系统调用(例如sbrk()),并且我正在尝试在我添加到heap的内存块中存储任何类型的指针和无符号整数。为了清楚起见,
sizeof
操作符返回字节大小。我不明白你在问什么。您是否尝试过打印结果大小以检查它是否符合您的预期?我相信您知道自己在做什么,并且意识到使用它代替malloc会降低程序的性能,因此sbrk将只接受字节参数?我似乎记得,您分配的内存类型会影响sbrk或SBR的大小malloc@mrswmmrLinux
sbrk
函数和标准的
malloc
函数将字节数作为其操作数,