3

This is from 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

This is from the code:

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

You can see that both database->size and size are from the (unsigned int) type, in both code and gdb, but for some reason, after the assignment the values are different.

Does anyone knows the what is the reason of that?

4

1 に答える 1

1

database は関数 alloc_database に対してローカルです。malloc の結果を代入しますが、この代入は関数に対してローカルです。戻った後、データベースは関数が呼び出されたときの値に戻ります。gdb では、データベースが返された後に、database->size の値を調べることに注意してください。したがって、データベースの値が関数の外にあるスコープで検査します。

次の 2 つのオプションがあります。

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

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

于 2012-12-27T21:47:29.323 に答える