2012-07-27 45 views
0

我有一個關於在結構及其可靠性上使用memset和memcopy的查詢。對於如:Memcpy和Memset在C中的短類型結構

我有一個代碼,看起來像這樣

typedef struct 
    { 
    short a[10]; 
    short b[10]; 
}tDataStruct; 

tDataStruct m,n; 

memset(&m, 2, sizeof(m)); 
memcpy(&n,&m,sizeof(m)); 

我的問題是,

1):在memset的,如果我設置爲0,它是好的。但是,當設置2我得到m.a和m.b爲514而不是2.當我把它們作爲字符而不是短的它是好的。這是否意味着我們不能將memset用於除0之外的任何初始化? 2):在short類型的上面兩個結構之間做memcopy是否可靠?我有一個巨大的 字符串a,b,c,d,e ...我需要確保副本是一對一完美的。 3):我最好在單個數組上使用memset和memcopy,而不是像上面那樣收集結構?

一個多個查詢,

在藥結構上面我有變量數組。但是,如果我通過指針,這些陣列 ,我想在一個結構

typedef struct 
    { 
    short *pa[10]; 
    short *pb[10]; 
}tDataStruct; 

tDataStruct m,n; 

memset(&m, 2, sizeof(m)); 
memcpy(&n,&m,sizeof(m)); 

收集這些指針在這種情況下,如果我或存儲器複製的memset的它只會改變地址,而不是價值。我如何改變這些值呢?原型是否錯誤?

請建議。您的投入都非常小鬼

感謝 DSP傢伙

回答

1
  1. 的memset集的字節,而不是短褲。總是。出現在字節邊界上的514 =(256 * 2)+(1 * 2)... 2s。 1.a.誠然,這確實減少了它對於你想要做的(數組填充)等目的的有用性。
  2. 只要兩個結構都屬於同一類型就可靠。只是要清楚,這些結構不像您所建議的那樣是「簡短」的。
  3. 如果我理解你的問題,只要他們屬於同一類型,我不認爲它很重要。

只要記住,這些是字節級別的操作,沒有什麼更多,沒有什麼更少的。另見this

對於你的問題的第二部分,嘗試

memset的(m.pa,0,的sizeof(*(m.pa));
memset的(m.pb,0,的sizeof(* (m.pb));

注意兩個操作從兩個不同的地址(m.pa複製,m.pb是因爲你還認得有效地解決了)還要注意的sizeof:不和sizeof的引用,但的sizeof。什麼是引用。類似的memcopy。

+0

嗨理查德,感謝您的答覆。我的問題米是我的所有數據爲16位字。如果memset只在字節上工作,那麼我不能在單詞上使用它,因爲它給了我錯誤的答案。它是否正確? – user437777 2012-07-27 05:44:15

+0

你有兩個例外是正確的:你可以用它來填充0或-1(0xFF)。對其他值不太有用。 – 2012-07-27 05:48:12

+0

謝謝理查德。現在清楚了。我已經更新了一個查詢,將不勝感激您的輸入 – user437777 2012-07-27 05:51:29