2012-12-27 23 views
3

正確的值這是從GDB:Ç - unsigned int類型並沒有得到執行任務

22  database->size = size; 
(gdb) n 
23  return database; 
(gdb) p size 
$6 = 1401 
(gdb) p database->size 
$7 = 3086862424 
(gdb) p &size 
$8 = (unsigned int *) 0xbffff050 
(gdb) p &database->size 
$9 = (unsigned int *) 0xb7fc6ff8 

這是從代碼:

typedef struct _DATABASE { 
    RESULT* res; 
    unsigned int size; 
} DATABASE; 

.... 
.... 

DATABASE* alloc_database(unsigned int size, DATABASE* database) 
{ 
    database = (DATABASE*) malloc (sizeof(DATABASE)); 
    if (!database) return NULL; 
    database->res = (RESULT*) malloc (sizeof(RESULT) * size); 
    if (!database->res) { 
     free_database(database); 
     return NULL; 
    } 
    memset(database->res, 0, sizeof(RESULT) * size); 
    database->size = size; 
    return database; 
} 

你可以看到,這兩個數據庫 - >尺寸和大小都來自(無符號整型)類型,在代碼和gdb中,但由於某種原因,賦值後的值不同。

有誰知道這是什麼原因?

+3

曾聽說過'calloc()'?它確實在一個函數調用中分配和調零 - 並且可以使用最佳效率的調零,因爲它知道memset()不支持的地方數據是對齊的。 –

+1

你確定你的代碼是沒有優化編譯的嗎? – nos

+0

調用函數是什麼樣的? –

回答

1

數據庫對函數alloc_database是本地的。你爲它分配了一個malloc的結果,但是這個賦值對於該函數是本地的。返回後,數據庫返回到調用函數時的值。請注意,在gdb中,您檢查數據庫 - >大小的值,在返回後。因此,您可以在數據庫的值超出函數的範圍內對其進行檢查。

你有兩個選擇:

  1. 改變功能只接收大小參數,分配給地方和返回。然後,您可以指定返回值並在gdb中檢查它:

  2. 如果要在數據庫參數中返回結果,則需要將指針傳遞給數據庫指針。

這是選項2的代碼:

DATABASE* alloc_database(unsigned int size, DATABASE** database) 
{ 
    *database = (DATABASE*) malloc (sizeof(DATABASE)); 
    if (! *database) return NULL; 
    (*database)->res = (RESULT*) malloc (sizeof(RESULT) * size); 
    if (!(*database)->res) { 
     free_database((database); 
     *database = NULL; 
     return NULL; 
    } 
    memset((*database)->res, 0, sizeof(RESULT) * size); 
    (*database)->size = size; 
    return (*database); 
} 

P.S. אהבהלאבאהבחינם...

+0

那麼,如果它作爲返回值傳遞回來,它應該沒問題。如果調用代碼期望它被填充,你的解決方案是好的[我嘗試編輯它以使佈局正確,但不知何故,它不喜歡它。我會再去一次。 [再一次,問題很可能出現在我們看不到的代碼中 - 80%的規則適用] –

+0

只是進一步的說明。對於指向指針的指針傳遞沒有意義,並返回數據庫指針。 –

+0

+1,用於發現正確的問題並提供解決方案。 OP可能會用相同的數據庫指針重複地調用它,如果是這樣,它(以及它們通過推理)仍然會泄漏內存,就像之前那樣。儘管如此,你只能做很多事來保護他人。 PS:我更喜歡out-params來返回結果。 – WhozCraig