標籤:

【C語言】關於C裡面數組批量初始化?

1.定義兩個數組:

int a[1000];

char str[1000];

2.現在要把a裡面1000個全部初始化為5;str裡面全部初始化為a;不用循環的話,應該怎麼辦?

3.有人說:int a[1000] = {0}; char str[1000] = {"a"}; 但這樣只有第一個元素被設置,其餘999個自動默認是int 的0;

4.那是否可以使用memset,比如對於str數組這樣用:memset(str,"a",sizeof(str)),這樣char 型數組應該可以初始化,但是對於int數組應該怎麼辦呢?求前輩指點。。


你還是用C++ STL里的vector吧。vector a(1000,5);十分方便。雖然已經超過C語言的限制標準。


c標準庫有個limits.h的頭文件,裡面有你所使用機器的int char等類型變數的位元組長度和大小限制相關的宏,可以用這些宏來知道一個int對應幾個char位元組作為memset的實參,補充一下,看了後面答案,針對問題4的回答,int類型的指針str在使用memset時強制轉換為char類型指針


用 gcc 或者 clang 都可以搞

https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html


每次看到這種基本的東西標準不支持就蛋疼,就想安利C++11/14.

std::array& a;
a.fill(29);


沒有辦法


int a[1000] = {[0 ... 999] = 5};

..........

補充一下,類似的方式可以讓前500個元素等於1,後500個等於0,手機打字,不方便,有心人自己嘗試吧,


為什麼要有不用循環這要求~~~


int a[] = { 5, 5, 5, 5, 5......, 5};//1000個5

就行了。

如果覺得麻煩的話…

就用宏吧!


我就說下memset,那個函數你如果看到了函數頭就知道了,第二個參數,會強制轉換成char的,然後,也就是說,即便是你想給int刷,刷的東西也非常有限。

當然有沒有函數呢?有的,這個函數叫fill,然而,這個函數是c++的,超過了C語言的狹義範疇了。

參考文獻:

fill c++ std::fill - cppreference.com

memset c++ std::memset - cppreference.com

memset c memset, memset_s


寫一個數據文件,定義數組的時候直接include這個文件即可。類似

char filename[] = "d:\in.dat";


我想提醒的是int a[1000] = {0};就是把a中的1000個元素全部初始化為0,但是int a[1000] = {5};並不是把1000個元素初始化為5,它只是初始化第一個


直接用循環初始化。


不用循環還可以用遞歸,然而這有什麼卵用?


首先,memset函數是逐位元組進行填充,所以a一般為char *型。

其次,對於其它類型的a,可以填充的值有兩個:0和-1,這是由於計算機中用二進位補碼錶示數字,0和二進位補碼為全0,-1的二進位補碼為全1。

最後,如果是memset(a,5,1000*sizeof(int)),就會對每個位元組填充5,所以一個int則為0x05050505。

@Neicul Luc 提醒,memset填充int數組中的數字,除了0和-1可以直接用0和-1填充外,其它不方便填充!如果你想得到0x05050505,那用5填充到是一個機智的做法!


保存一個binary文件,把文件里的內容直接load進去。


推薦閱讀:

c++程序哪些應該放在頭文件裡面,哪些應該放在源文件裡面?
編譯器生成的彙編語句執行順序為什麼與C代碼順序不同?
編譯器能否對如下場景優化,以及如何檢查不同編譯器對此是否做了優化?
C++如何判斷一個整數溢出?
c語言中一個函數的聲明和定義有區別嗎?

TAG:C編程語言 | CC |