今天我遇到了一個非常奇怪的問題。長話短說,我的函數返回一個值,調用者獲得不同的值。 某處在我的代碼,我不得不打電話:C函數更改返回值。損壞的堆棧?
Message* m = NULL;
m = connection_receive(c);
凡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;
}
這裏有一個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
當然,如果我們嘗試訪問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;
}
編輯2: 已解決。謝謝大家。 問題是頭文件上的拼寫錯誤。 我不能使用 - 錯誤,因爲我需要做的事情,其中 提出了一些警告,並在一個很大的輸出和大頭我錯過了。
我曾經發生過一次。 'fin'顯示一個返回值,它存儲的變量顯示另一個值。重新編譯修復了它(甚至沒有改變源代碼);最好我能猜到的是一個依賴的對象文件沒有得到重新編譯,否則可能是一個(很少遇到)gcc中的錯誤。 – Kevin
你需要把它解釋爲一個[SSCCE](http://sscce.org/),它演示了這個問題併發布了它 - 你發佈的代碼沒有問題;問題在於別處。 –
@BrianRoach,我會看看我能做些什麼。這是一個很大的項目。 – Victor