malloc()古怪-总是分配8字节?

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

我在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 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的)经常出现在注释中。谢谢!只要它允许我,我就接受。既然你已经解释过了,那就很有道理了。