2012-04-15 59 views
-1

我正在爲存儲一些股票市場數據的類項目創建鏈接列表。我試圖將一些數據存儲到堆棧而不是mallocing到堆中。我正在嘗試使用memcpy來做到這一點。我的代碼是這樣的:使用memcpy而不是mallocing將空間存儲到堆棧

struct trade{ 

int a,b; 
float c; 
struct trade *n; 
}; 
char stack[100]; 
int i = 0; 

void newNode(struct trade **head, int a, int b, float c){ 
struct trade *node; 
if(i<99){ 
    memcpy(&a,&stack[i],4); 
    i = i + 4; 
    node = (struct lnode*) malloc(16); 
} 

    else 
    node = (struct lnode*) malloc(20); 
} 
..... 
..... 
} 

我的newnode函數是每當我創建一個新節點,我需要malloc空間來調用它。

如果堆棧數組中仍有空間,我將int複製到堆棧數組中,否則我將malloc放入堆中。我使用20和16,因爲如果我將int存儲在堆棧中,那麼我需要malloc空間來存放結構中剩餘的16個字節,否則我需要20個字節的malloc空間。

由於某種原因,我在執行此操作時遇到段錯誤。如果有人能指引我朝着正確的方向,我將不勝感激。

謝謝!

+3

當'i'爲'96'且int的第4個字節爲memcpy()'d時會發生什麼? – user268396 2012-04-15 03:01:42

+0

嗯,我不能是96.因爲索引從0開始,它只增加4我所以我會在95和複製第4個字節它將達到堆棧數組的末尾,它不會進入如果陳述不再 – AndroidDev93 2012-04-15 03:05:03

+1

你爲什麼試圖這樣做? – 2012-04-15 03:05:48

回答

3
  1. 你有你的memcpy參數交換。目標應該是第一個參數:

    memcpy(&stack[i],&a,4); 
    

    從手冊頁:

    SYNOPSIS 
    
    void * memcpy(void *restrict s1, const void *restrict s2, size_t n); 
    
    DESCRIPTION 
    
    The memcpy() function copies n bytes from memory area s2 to memory area 
    s1. If s1 and s2 overlap, behavior is undefined. Applications in which 
    s1 and s2 might overlap should use memmove(3) instead. 
    
  2. 如果你正在編譯任何東西,但32位x86,整數和指針不會是4個字節,但例如8爲64位,這會導致問題。你應該真的使用sizeof(int)。這也會影響16和20,你可以用sizeof(lnode)替代。這些在編譯時設置爲正確的值,所以不會影響速度。

  3. 除了定義「堆棧」與堆的問題:爲什麼要將堆棧定義爲char數組而非int?可以使用一個char數組,但是它更容易和更不容易出錯,只需將它分配給相同類型的數組而不是memcpy。

  4. Valgrind是您這種調試的朋友。我發現自己使用它作爲段錯誤和內存泄漏的標準調試工具。

+0

當你可以有int數組時,可能想要提到試圖將int整數複製到char數組中的一般奇怪... – user268396 2012-04-15 09:50:35