malloc()古怪-总是分配8字节?
我在malloc身上经历了一些我不理解的行为 例如,为结构分配内存效果很好,即:malloc()古怪-总是分配8字节?,c,memory-management,C,Memory Management,我在malloc身上经历了一些我不理解的行为 例如,为结构分配内存效果很好,即: typedef struct my_struct { char buffer[4096]; struct my_struct *next; } MY_STRUCT; ... MY_STRUCT *ptr = (MY_STRUCT *)malloc(sizeof(struct my_struct)); printf("malloc() gave us %lu byt
typedef struct my_struct {
char buffer[4096];
struct my_struct *next;
} MY_STRUCT;
...
MY_STRUCT *ptr = (MY_STRUCT *)malloc(sizeof(struct my_struct));
printf("malloc() gave us %lu bytes\n", sizeof(*ptr));
printf("My structure's first member is %lu in length\n", sizeof(ptr->buffer));
free(ptr);
...
返回
malloc() gave us 4104 bytes
My structure's first member is 4096 in length
…一如所料。现在,当我尝试为字符串动态分配缓冲区时:
int bufsize = 4096;
char *buffer = (char *)malloc(sizeof(char)*bufsize);
printf("bufsize: %d\n", bufsize);
printf("Allocated buffer size: %lu\n", sizeof(*buffer));
free(buffer);
…返回
bufsize: 4096
Allocated buffer size: 8
现在,我可以硬编码调用4096、1、4的malloc()。。。它总是在8点出现
我这里错了什么?sizeof
告诉您编译器认为某个东西的大小是多少
如果ptr
是myu结构*
,则sizeof(*ptr)
将始终与sizeof(myu结构)
相同。即使ptr指向NULL,或者指向MY_STRUCT
s的数组,或者指向已经释放的内存,等等,这也是正确的
sizeof
不能用来告诉您分配给malloc
的内存块的大小。您不能使用malloc
返回的指针来查找分配的内存。分配的内存,如果成功的话,就是所要求的,也就是说,你已经知道了..嗯--op的帖子里还有一些奇怪的东西sizeof(*buffer)
对于char*buffer
应该给出1,而不是8。打印size\t
值(例如sizeof
的结果)的正确格式是%zu
sizeof(*buffer)
应该产生1
,而不是8
。buffer
的声明更简单地写为char*buffer=malloc(bufsize)代码>malloc()
如果失败,则返回NULL
;经常检查一下。如果它不返回NULL
,它将分配您要求的大小。^^奇怪的是,最完整的答案(Keith的)经常出现在注释中。谢谢!只要它允许我,我就接受。既然你已经解释过了,那就很有道理了。