2010-08-27 95 views
9

我有一個2D和我想設置的元素爲零不用循環的所有元素填寫多維數組元素用0

int a[100][200]; 

我不能在聲明的點初始化它們。

+3

爲什麼你不能在聲明的時候初始化它們? – 2010-08-27 17:44:50

+0

你想在課堂上申報嗎? – cpx 2010-08-27 18:06:59

回答

2

memset(a, 0, 100 * 200 * sizeof(int));應該這樣做。

13

嘗試memset(a,0,sizeof(a));

這簡單地將覆蓋使用由陣列與0字節的存儲器。除非你真的知道你做什麼,否則不要爲用戶定義的數據類型執行此操作。還有std::fillstd::fill_n,這是更多的C++ ISH(但不是這裏最簡單的方法)。

+2

即使對於非用戶定義的數據類型,這可能會產生意想不到的結果。數據成員指針是一個在GCC和Clang(「Itanium ABI」)使用的C++-ABI中使用非0×0空指針編碼的示例 - 它們使用全1位。對於「int」,這應該沒問題。 – 2010-08-27 20:55:04

+0

不應該在這裏使用'sizeof(a)* sizeof(int)'嗎? – Mikhail 2012-12-02 22:45:43

+2

不,數組sizeof以字節返回正確的大小,因此不需要乘以int大小。 – 2012-12-03 02:18:23

1

如果這個數組是在文件範圍聲明的,或者在函數範圍內聲明爲'static',那麼它會自動初始化爲零,你不必做任何事情。這隻適用於一個在程序啓動時的初始化;如果你需要重置它,你必須自己編碼。我會使用memset

如果它在不帶靜電的功能範圍內聲明的,你需要使用memset,或顯式的初始化 - 單= { 0 }是不夠的,你不需要寫出所有200個零喜歡別人建議。

+0

還應該補充說明靜態變量與非靜態聲明的變量的語義是非常不同的。聲明爲靜態的變量固有地聲明一個狀態;這可能不是OP想要的。我同意memset方法(或明確的初始化方法)。 – Schedler 2010-08-27 18:04:33

23

嘗試

int a[100][200] = {{0}}; 

如果初始化一些(但不是全部)的元素,其餘的將被初始化爲零。在這裏,你只是明確地初始化第一個子數組的第一個元素,編譯器正在處理其餘的部分。

+1

+1'= {0}'也應該有效,但這可能會更好地避免編譯器警告。 – Potatoswatter 2010-08-27 20:30:25

+12

爲了縮短它,C++允許'= {};'。 – 2010-08-27 20:45:12

1

「我無法在聲明點初始化」是什麼意思? 「不知道如何」?或者「不能修改那裏的代碼」?

C++語言的特徵在於在聲明點

int a[100][100] = {}; 

初始化整個陣列爲0(注意,沒有明確0{}之間確實需要)。你可以使用它嗎?

如果不能,那麼你的選擇是:使用memset -hack,1D-重新解釋,黑客或通過數組(S)迭代(有或沒有幫助FO std::fill)設置的每個元素明確。

+0

聲明時的初始化是被禁止的,例如,當goto或switch切換到聲明中時,就會將其轉換爲變量的作用域。 – Potatoswatter 2017-02-06 02:05:43

0

提到的memset方法(memset(a,0,sizeof(a));)會起作用,但是如何使用C++方式(根據您的標記)以及使用向量?

std::vector<std::vector<int> > a; 
a.assign(100, std::vector<int>(200)); 
3

C++允許多維數組完全通過基元素指針進行迭代。所以,你可以使用std::fill,並將它傳遞的第一個非數組元素

std::fill(a[0] + 0, a[99] + 100, 0); 

在C,這是正式不允許的,你需要通過每個單獨子陣列迭代,因爲迭代超越了第一子陣列的過去,在C指針導致C中未定義的行爲儘管如此,實際上這仍然有效。

+0

這仍然是真的嗎? (是否曾經?) – Potatoswatter 2017-02-06 02:04:31

0

我測試了這個解決方案,它工作。

int arr[100][200]; 

for (int i=0; i<100; i++) 
    for (int j=0; j<200; j++) (arr[i][j] = 0); 

for (int i=0; i<100; i++) 
    for (int j=0; j<200; j++) cout << (arr[i][j]); 
2

對於C++,您可以使用算法頭中的std:fill方法。

int a[x][y]; 
std::fill(a[0], a[0] + x * y, 0); 

所以,你的情況,你可以這樣做:

int a[100][200]; 
std::fill(a[0], a[0] + 100 * 200, 0); 

當然,0可以爲任何int值被改變。

0

許多答案使用指針運算與fill。這是可以做到簡單:

int a[N][K]; 
fill(a[0], a[N], 0); 

基本上,a[N]是多維數組後第一個內存地址,不管有多少尺寸也有。這工作太:

int a[N][K][L][M]; 
fill(**a[0], **a[N], 0); 

這裏的星號解引用指針下降到int*類型(數組括號解引用int****int***,兩個星號做工作的其餘部分)。