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

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

可以看到database->size 和size 都是(unsigned int) 类型,在代码和gdb 中都是,但是由于某些原因,赋值后的值不同。

有谁知道这是什么原因吗?

最佳答案

数据库对于函数 alloc_database 是局部的。您将 malloc 的结果分配给它,但该分配对函数而言是局部的。返回后,数据库返回到调用函数时的值。请注意,在 gdb 中,您在返回后检查 database->size 的值。所以你在数据库的值在函数之外的范围内检查它。

你有两个选择:

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

附言אהבה לא באה בחינם...

关于C - unsigned int 在赋值时没有得到正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14061590/

相关文章:

c - 分配大小错误或自由方法的错误使用?

python - 获取错误 "Undefined command: "python ". Try "帮助”。当使用 gdb 进行 python 调试时

javascript - 具有解构的对象属性分配?

c - 在终止我的 TCP/IP 连接后使用 POSIX "write"函数会使我的应用程序崩溃 - 为什么?

c++ - C/C++ 套接字 : IPv6 TCP connection fails if I do anything before it

c - IA32 寄存器地址

C 指针未正确分配

java - 对象数组赋值问题

c - 在 C 中获取当前时间/日期/日期的最有效方法

c++ - gdb: 打印 sockaddr 指针值