malloc未分配正确的字节数

malloc未分配正确的字节数,c,malloc,C,Malloc,通用条款4.7.0 c89 我使用以下方法分配内存: db_data_size = 32; db->db_data[i]->name = malloc(db_data_size); (gdb) p db_data_size $24 = 32 (gdb) p sizeof(db->db_data[i]->name) $25 = 8 (gdb) n 205 db->db_data[i]->email = malloc(db_data_size); (gdb)

通用条款4.7.0 c89

我使用以下方法分配内存:

db_data_size = 32;
db->db_data[i]->name = malloc(db_data_size);

(gdb) p db_data_size
$24 = 32
(gdb) p sizeof(db->db_data[i]->name)
$25 = 8
(gdb) n
205   db->db_data[i]->email = malloc(db_data_size);
(gdb) p sizeof(db->db_data[i]->name)
$26 = 8
在调试器中,我得到了8个字节,而不是我认为应该分配的32个字节

我的结构是:

struct data {
    int id;
    int set;
    char *name;
    char *email;
};

struct database {
    struct data **db_data;
    size_t database_rows;
    size_t database_data_size;
};
我唯一能想到的是一个字符*是8个字节,这就是我得到的。然而,在malloc中,我明确要求32个字节

sizeof(db->db_data[i]->name)
告诉你的大小

char *name;
这是指向char的指针的大小。它不会告诉您所分配块的大小;如果您需要记住这一点,则必须将其单独存储

因此,8是64位系统上指针的正确答案。

sizeof是一个编译时运算符,它给出了数据类型的大小。它不会告诉您分配的内存块的大小,而是告诉您char*的大小,在64位系统上,char*的大小是8字节


由您来跟踪分配块的大小。

这显然是新手的常见错误;另一个例子是最近发布的:更一般地说,新手的错误是假设你从它的名字知道它做什么-我分配了一个字节大小为32:db_data_size=32;db->db\U数据[i]->name=mallocdb\U数据\U大小;