函数调用后指针返回值发生变化

时间:2011-12-18 15:22:20

标签: c pointers return-value

来自两个C源文件的代码片段:

A.C

Channel *testChannelGet()
{
    Channel *ch = channelGet (parser,parserCh);
    return ch;
}

B.c

Channel *channelGet(UINT8 parser, UINT16 parserCh)
{
    chnl.player = &solPlayer;
    return((Channel *)&chnl);
}

我编译这两个文件并创建一个静态库和一个共享库。现在我从示例程序中调用testChannelGet。当我将它链接到静态库时,它完美地工作。但是,如果我将它链接到共享库,它的SEGFAULTing。调试告诉我,从channelGet返回的指针正在改变它返回的时刻。 GDB输出如下。

174         Channel *ch = channelGet (parser,parserCh);
(gdb) s
channelGet (parser=1 '\001', parserCh=1) at B.c:15174
15174           chnl.player = &solPlayer;
(gdb) n
15175           return((Channel *)&chnl);
(gdb) p ((Channel *)&chnl)
$1 = (Channel *) 0x7ffff7fed1a0
(gdb) n
15176   }
(gdb) n
testChannelGet at A.c:175
175         return ch;
(gdb) p ch
$2 = (Channel *) 0xfffffffff7fed1a0

现在地址值似乎指向不同的偏移量 - 0xfffffffff7fed1a0 vs 0x7ffff7fed1a0。两个地址中的最后一个字节是相同的。

任何提示?我试过-fPIC选项无济于事。

2 个答案:

答案 0 :(得分:5)

channelGet()中的A.c范围内是否有原型?

如果没有,您看到的结果可以解释如下:

    假设
  • channelGet()返回int(由于缺少原型),因此结果被截断为0xf7fed1a0
  • 然后它被转换为64位指针,因此符号扩展到0xfffffffff7fed1a0

(如果您在启用警告的情况下进行编译,您应该得到关于此的投诉......)

答案 1 :(得分:1)

valgrind下运行您的程序。查找并修复其报告的任何错误。