tph*_*pps 3 c pointers memory-corruption
自从我完成任何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;
}
Run Code Online (Sandbox Code Playgroud)
通话功能:
struct server_type *do_init_server(Cfg *cfg)
{
struct server_type *res = NULL;
res = (struct server_type *)init_gwserver(cfg);
if (res) {
return res;
}
}
Run Code Online (Sandbox Code Playgroud)
好的,这是奇怪的.当"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...`
Run Code Online (Sandbox Code Playgroud)
这可能是非常非常简单的事情,但我不能指责它.有人有建议吗?
谢谢!托比.
这个演员看起来很可疑:(struct server_type *)init_gwserver(cfg)
.
如果需要使用强制转换来编译代码,则表明init_gwserver
在调用站点上没有可见的正确原型.
如果没有原型可见,编译器将假设函数返回一个int
.当返回值被检索为不是它的东西时,取决于实现,它的值可能被破坏,并且当转换回指针时,信息可能已经无可挽回地丢失.
不需要强制转换,如果删除它会导致编译错误,则表示您需要在尝试调用它之前添加(或#include
)正确的原型init_gwserver
.