2012-06-19 27 views
0

從我的memcpy中得到一個seg錯誤,gdb無法給我任何其他東西(至少超出了我知道如何使用gdb的簡單方式......)。這件事使用Berkely DB深入嵌入了一些代碼;我已經拿出了任何應用的唯一線路。memcpy Seg故障看起來很不可思議

void *databuf; 
    int smallest; 
    databuf=malloc(2*sizeof(int)); 
    memset(databuf,0,2*sizeof(int)); 



    /* This next line comes from the DB structures; key.data is a void*... */ 
    smallest=*(int *)key.data; 

    memcpy(databuf,(void *)smallest,sizeof(int)); 

要確認變量最小的是正確的,我可以運行GDB,並得到

(gdb) print smallest 
$1 = 120321 

我收到(在GDB)的錯誤是我的沒用

Program received signal SIGSEGV, Segmentation fault. 
0x08048efa in main (argc=4, argv=0xbffff344) at index_DB-1.1.c:128 
128  memcpy(databuf,(void *)smallest,sizeof(int)); 
(gdb) backtrace 
#0 0x08048efa in main (argc=4, argv=0xbffff344) at index_DB-1.1.c:128 

原因這樣做主要是因爲我是混蛋伯克利DB教程,但後來我也想做

memcpy(databuf+len,(void *)largest,sizeof(int)); 

即有一個void指針databuf,其中第一個是最小的整數,第二個是最大的整數。我錯過了什麼?

+0

事實上,你認爲錯誤信息是「無用的」是一個很大的線索,你失去了什麼。換句話說,您錯過了錯誤信息實際提供給您的信息。 :) – unwind

+0

哈哈,我正在考慮口語意義上的「無用」這個詞。我知道seg故障可能意味着某種無效的內存條目,這是有用的信息......但是* more *有用的信息將是「(void *)最小的不是有效的指針,你是白癡! – levitopher

回答

4

在這個步驟中,您在解釋的smallest值作爲一個指針:

memcpy(databuf,(void *)smallest,sizeof(int)); 

因爲該值幾乎可以肯定不是一個有效的指針,這是造成你的段錯誤。相反,你可能會想:

memcpy(databuf, &smallest, sizeof smallest); 

除非你需要smallest其他一些原因,雖然,你可以直接從key.data複製到databuf

memcpy(databuf, key.data, sizeof(int)); 
+0

我很欣賞它,即使它是一個簡單的答案。我其實認爲cast(void *)會將最小值複製到databuf指向的內存中。顯示我不理解這些事情,以及我認爲。謝謝! – levitopher

2

很難告訴你在做什麼,考慮代碼是如此可怕,但這種看上去很可疑:

memcpy(databuf,(void *)smallest,sizeof(int)); 

我相信smallest包含正常整型數據,而不是指向任何東西。那麼,你爲什麼取消它的引用?它沒有指向任何東西。

你可能想:

memcpy(databuf,(void *) &smallest,sizeof(int)); 

此外,這是犯罪嫌疑人:

smallest=*(int *)key.data; 

smallest保證是整數對齊?

4
(void *)smallest 

這需要的整數值最小並將其視爲指針。你打算做的是這樣的:

(void *)&smallest