簡體   English   中英

C - unsigned int在賦值時沒有得到正確的值

[英]C - unsigned int doesn't get the correct value on assignment

這是來自gdb:

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

你可以看到數據庫 - >大小和大小都來自(unsigned int)類型,代碼和gdb,但由於某種原因,在賦值后,值是不同的。

有誰知道這是什么原因?

數據庫是函數alloc_database的本地數據庫。 您為其分配了malloc的結果,但此賦值對於函數是本地的。 返回后,數據庫返回到調用函數時的值。 請注意,在gdb中,在返回之后檢查database-> size的值。 所以你在數據庫的值在函數之外的范圍內檢查它。

您有兩種選擇:

  1. 更改函數只接收size參數,分配給本地並返回它。 然后你可以分配返回值並在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);
}

PSאהבהלא地圖בחינם...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM