2013-10-31 35 views
6

我試圖在純2D陣列使用memset的,使用下面的代碼段:memset的不工作

#include <iostream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    int l[3][3]; 
    memset (l, 1, sizeof(l)); 
    for (int i = 0; i < 3; i++) { 
     for (int j = 0; j < 3; j++) { 
      cout << l[i][j] << " "; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

我希望整個陣列1被初始化使用線:

memset(l,1,sizeof(l));

但我沒有得到預期的價值,它給了我下面的輸出:

16843009 16843009 16843009 
16843009 16843009 16843009 
16843009 16843009 16843009 

認爲這可能是一個編譯器的問題,所以我嘗試使用Ideone:

http://ideone.com/VFYUDg

請幫忙。

回答

17

memset作品的字節,所以它填補你的int數組0x01010101值(假設int是32位),如果您需要填寫一個2維C數組有是小數16843009.

數:

int l[3][3]; 
std::fill_n(*l, sizeof l/sizeof **l, 1); 

*l這裏衰變int[3][3]成指向數組(int*)的第一個元素,sizeof l/sizeof **l得到的數組元素的計數。

它使用C++要求將數組連續佈置在內存中,無間隙,以便多維數組具有與一維數組相同的佈局。例如。 int [3][3]int[3 * 3]具有相同的佈局。

而且,與memset,std::fill_n不同,它不是在字節上進行操作。對於內置類型,優化版本通常以SIMD指令形式顯示,效率不低於memset

+0

所以如果我想用整數值1或2來初始化整個數組,我應該使用什麼? – shivshnkr

+0

@ user123456使用'std :: fill'或'std :: fill_n'。 –

4

其實,它的工作非常好...

168430090x01010101(十六進制)十進制表示。

memset完成了它的工作權利,即它將提供的存儲區中的每個字節初始化爲0x01

+0

那麼如何使用memset將我的數組初始化爲0以外的整數值? – shivshnkr

+0

@ user123456'memset'將__always__以字節爲單位工作。因此,您只能使用週期性字節模式來初始化陣列。 – Rerito

-2

如果您的目標是所述陣列的每個項目設置爲1,則以下將做你的工作,

INT升[3] [3] = {1,1,1,1,1,1 ,1,1,1-};