我今天遇到了一个非常奇怪的问题.长话短说,我的函数返回一个值,调用者得到一个不同的值.在我的代码附近我接到一个电话:
Message* m = NULL;
m = connection_receive(c);
Run Code Online (Sandbox Code Playgroud)
其中connection_receive的定义如下:
Message* connection_receive(Connection* c)
{
Message* k;
if (c->state == CON_STATE_AUTHENTICATED)
{
pthread_mutex_lock(&c->mutex_in);
if (g_queue_is_empty(c->in))
k = NULL;
else
k = (Message*)g_queue_pop_head(c->in);
pthread_mutex_unlock(&c->mutex_in);
/* Until here, k is reachable and contains the correct data. */
return k;
}
else
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
这是一个gdb运行,我在返回之前和分配之后就停止了:
222 return k;
(gdb) p k
$1 = (Message *) 0x7ffff0000950
(gdb) n
226 }
(gdb) n
main () at src/main.c:57
57 if (m)
(gdb) p m
$2 = (Message *) 0xfffffffff0000950
Run Code Online (Sandbox Code Playgroud)
当然,如果我们尝试访问0xfffffffff0000950,我们将得到分段错误.
如果我更改函数而不是返回值,使用第二个参数传递它的值,但我想知道这个问题出了什么问题.
非常感谢你.
编辑:这有效,但不方便.而且我也想知道为什么会出现这种奇怪的错误.
void connection_receive2(Connection* c, Message** m)
{
if (c->state == CON_STATE_AUTHENTICATED)
{
pthread_mutex_lock(&c->mutex_in);
if (g_queue_is_empty(c->in))
*m = NULL;
else
*m = (Message*)g_queue_pop_head(c->in);
pthread_mutex_unlock(&c->mutex_in);
}
else
*m = NULL;
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:解决了.谢谢大家.问题是头文件上的拼写错误.我不能使用-Werror因为我需要做一些引发警告的事情,并且在一个大的make输出和大标题中我错过了它.
m定义如何?我怀疑与类型不匹配,我的问题2是所有问题的症结所在.
你正在返回一个指针(我猜是这样)48或64位.然而,调用者认为得到一个int可能有32位且已签名的.在转换回指针时,值会进行符号扩展.