2012-10-27 85 views
0

memcpy在我的程序中表現得很奇怪。我的函數被調用兩次,所以memcpy行運行兩次,第一次工作沒有問題,第二次我在該行得到一個seg fault(使用gdb)。我很困惑,因爲我不明白爲什麼它會起作用,但不是兩次......另外,我輸入的兩個名稱長度相同。爲什麼memcpy不能在第二次嘗試中使用?

這是我...

typedef struct _item_ 
{ 
    char name[500]; 
}item; 


int my_function(char *name) 
{ 

    item *myitem = malloc(sizeof(item)); 

    char* temp = myitem->name; 

    strcpy(temp, name); 

    /* code here to write add item to a global structure */ 

    return 0; 

}

在測試代碼

...

int i; 
i = my_function("test1"); 
. 
. 
. 
i = my_function("test2"); 

後來我改變它的strcpy和發生

同樣的問題
strcpy(temp, name); 

任何ID爲什麼這可能不起作用?

+0

什麼是'my_struct-> name'指向? –

+0

它指向一個字符[500] – spatara

+4

這不能回答給出的信息發佈一個可編輯的,最小化的例子,以顯示問題 – interjay

回答

1

哦,okaaay然後。那麼,你需要看看你的代碼。特別是在你給memcpy或strcpy指向的目標指針處。您的消息清楚地表明您正在嘗試寫入您不屬於自己的內存。這是一個使用您提供的代碼的最小可編譯版本。它工作得很好。該函數被調用20,000次並返回有效結果。當所有20,000個元素被打印出來時,這被驗證。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct _item_ 
{ 
    char name[500]; 
}item; 

item *my_function(char *name) 
{ 
    item *myItem = (item*)malloc(sizeof(item)); 
    strcpy(myItem->name, name); 
    return myItem; 
} 

int main() 
{ 
    const int max = 10000; // 10,000 iterations 
    item *itemList[max*2]; // 2 operations per loop iteration 
    int j, index = 0; 
    for (j=0; j<max; j++) 
    { 
     itemList[index++] = my_function("test1"); 
     itemList[index++] = my_function("test2"); 
    } 

    index = 0; 
    for (j=0; j<max; j++) 
    { 
     printf("%d. - %s\n", 1+index, itemList[index]->name); 
     index++; 
     printf("%d. - %s\n", 1+index, itemList[index]->name); 
     index++; 
    } 
} 
3

在這種情況下,唯一可能的罪魁禍首似乎是:

(1)的malloc()失敗 - 你不檢查一個NULL結果

(2)事先腐敗亂七八糟的東西。

您可以通過讀取內存來獲得段錯誤,因此如果源參數不是以0結尾並且在找到可讀的0字節之前發生錯誤(並且在超過500個字符的接收數組之前發生錯誤),則可以添加第三個選項導致其他問題)。這些短字符串文字不會發生,所以像這樣的東西將不得不落在(2)之下。

你的代碼段被黑客入侵了一個主程序(內存泄漏和所有的)並沒有失敗。 (請參閱hnhzflep的答案,以獲得更詳盡的演示 - 那不會爆炸。

相關問題