C - unsigned int在赋值时没有得到正确的值

时间:2012-12-27 21:33:40

标签: c gdb variable-assignment unsigned-integer

这是来自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,但由于某种原因,在赋值后,值是不同的。

有谁知道这是什么原因?

1 个答案:

答案 0 :(得分:1)

数据库是函数alloc_database的本地数据库。您为其分配了malloc的结果,但此赋值对于函数是本地的。返回后,数据库返回到调用函数时的值。请注意,在gdb中,您在返回之后检查database-> size的值。所以你在数据库的值在函数之外的范围内检查它。

您有两种选择:

  1. 更改函数以仅接收size参数,分配给本地并返回它。然后你可以分配返回值并在gdb中检查它:

  2. 如果要在数据库参数中返回结果,则需要将指针传递给数据库指针。

  3. 这是选项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。 אהבהלאבאהבחינם...