2012-09-26 35 views
-1

GCC(GCC)的4.7.0 C89malloc的不分配正確數目的字節

我使用以下分配存儲器:

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; 
}; 

唯一想我能想到的是,一個char *爲8個字節,而這正是我得到。但是,在malloc中,我明確要求32個字節。

+3

這是菜鳥的常見錯誤,顯然;其他例子最近發佈:http://stackoverflow.com/questions/12598839/using-sizeof-with-sprintf-vsnprintf-corrupts-text –

+0

更一般地說,菜鳥的錯誤是假設你知道它的名字是什麼;-) –

+0

我已經分配了32位的字節大小:db_data_size = 32; db-> db_data [i] - > name = malloc(db_data_size); – ant2009

回答

5
sizeof(db->db_data[i]->name) 

告訴你的

char *name; 

其大小是一個指針的大小(爲char)。它不會告訴你分配塊的大小;如果你需要記住這一點,你必須單獨存儲它。因此8是64位系統上指針的正確答案。

1

sizeof是一個編譯時操作符,它給出了數據類型的大小。它不會告訴你分配的內存塊的大小,而是一個char*的大小,它在你的64位系統上是8個字節。

這取決於你跟蹤分配塊的大小。