gpt4 book ai didi

c - 简单的 C 指针问题

转载 作者:行者123 更新时间:2023-12-01 11:55:42 25 4
gpt4 key购买 nike

自从我完成任何 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 的正确原型(prototype)。

如果没有可见的原型(prototype),编译器将假定该函数返回一个int。当返回值被检索为不是它的东西时,根据实现,它的值可能会被破坏,并且当转换回指针时,信息可能已经不可挽回地丢失。

转换应该不是必需的,如果删除它会导致编译错误,则表明您需要在指向您尝试调用它的位置。

关于c - 简单的 C 指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7595973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com