简单的C指针问题



我已经很久没有做任何C编程了,我一直在处理一个非常简单的问题。我有一个简单的函数,它调用另一个函数,该函数在堆上分配一些内存,用一个结构填充它,并返回一个指针。一切看起来都很好,只是当指针返回到调用函数时,它的地址已损坏。

这是相关代码:

调用的函数:

struct server_type *init_gwserver(Cfg* cfg)
{
    struct server_type *res = NULL;
    // Lots of irrelevant code removed here - doesn't reference res.
    res = gw_malloc(sizeof(struct server_type));
    gw_assert(res != NULL);
    res->server_start = gwserver_start; // Pointer to a function
    res->server_stop = gwserver_stop; // Pointer to another function
    return res;
}

调用功能:

struct server_type *do_init_server(Cfg *cfg)
{
    struct server_type *res = NULL;
    res = (struct server_type *)init_gwserver(cfg);
    if (res) {
        return res;
    }
}

好吧,奇怪的地方就在这里。当"res"返回到调用函数时,指针指向的地址会发生变化,并成为无效的内存引用。以下是GDB的快速浏览。评论(//…(是我的。。。

Breakpoint 1, init_gwserver (cfg=0x100214e30) at init_gwserver.c:339
339 res->server_stop = gwserver_stop;
(gdb) print /x res
$18 = 0x100215b10
// Pointer above looks fine and seems to be a valid address
(gdb) p *res
$14 = {
    type = 0x100215460, 
    sql_enter = 0x100003820 <gwserver_start>, 
    sql_leave = 0x100005ae0 <gwserver_stop>, 
}
// Contents of the pointer are looking great
(gdb) next
340  return res;
(gdb) print /x res
$19 = 0x100215b10
// Pointer is unchanged - should return this value just fine.
(gdb) next
do_init_server (cfg=0x100214e30) at init_server.c:52
52 if (res) {
(gdb) print /x res
$20 = 0x215b10
// WOW - what the hell happened to the address pointed to by res? It lost the leading 100.
(gdb) p *res
Cannot access memory at address 0x215b10
// Yep, it's definitely now an invalid pointer. Crash time...`

这可能是一件非常非常简单的事情,但我无法理解。有人有建议吗?

谢谢!托比。

此强制转换看起来可疑:(struct server_type *)init_gwserver(cfg)

如果强制转换是编译代码所必需的,那么它表明在调用站点上没有init_gwserver可见的正确原型。

如果没有可见的原型,编译器将假设函数返回int。当返回值被检索为非返回值时,根据实现的不同,其值可能已损坏,并且当转换回指针时,信息可能已不可挽回地丢失。

强制转换不应该是必要的,如果删除它会导致编译错误,则表明您需要在尝试调用init_gwserver之前为其添加(或#include(一个正确的原型。

相关内容

  • 没有找到相关文章

最新更新