วิธีการเริ่มต้นอาร์เรย์ถึง 0 ใน C?


170

ฉันต้องการอาร์เรย์ว่างขนาดใหญ่ใน C ในระดับโลก มีวิธีการอื่นนอกเหนือจากการพิมพ์หรือไม่

char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };

?


26
ถ่าน ZEROARRAY [1024] = {0};

3
หากคุณจำเป็นต้องจัดสรรหน่วยความจำบนฮีปคุณสามารถใช้ calloc () ตัวอย่างเช่น char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Andrei Ciobanu

2
NB calloc นั้นใช้ได้ผลดีcharแต่ถ้าคุณต้องการ array-of-pointers คุณควรตั้งค่าเป็น NULL อย่างชัดเจนไม่มีการรับประกันว่า NULL จะแสดงเป็นศูนย์ไบต์ สิ่งนี้แม้ว่าตัวอักษร0โดยนัยหมายถึงตัวชี้โมฆะ
Adrian Ratnapala

ซ้ำกันเป็นไปได้ของวิธีการเริ่มต้นอาร์เรย์ใน C
AechoLiu

คำตอบ:


284

ตัวแปรโกลบอลและตัวแปรสแตติกถูกกำหนดค่าเริ่มต้นเป็นศูนย์โดยอัตโนมัติ หากคุณมี

char ZEROARRAY[1024];

ที่ขอบเขตส่วนกลางจะเป็นศูนย์ทั้งหมดที่รันไทม์ แต่จริงๆแล้วมีเป็นไวยากรณ์ชวเลขถ้าคุณมีอาร์เรย์ท้องถิ่น ถ้าอาร์เรย์ถูกเตรียมใช้งานบางส่วนองค์ประกอบที่ไม่ได้เริ่มต้นได้รับค่า 0 ของชนิดที่เหมาะสม คุณสามารถเขียน:

char ZEROARRAY[1024] = {0};

คอมไพเลอร์จะเติมรายการที่ไม่ได้เขียนด้วยศูนย์ หรือคุณสามารถใช้memsetเพื่อเริ่มต้นอาร์เรย์เมื่อเริ่มต้นโปรแกรม:

memset(ZEROARRAY, 0, 1024);

มันจะมีประโยชน์ถ้าคุณเปลี่ยนมันและต้องการรีเซ็ตมันกลับเป็นศูนย์ทั้งหมด


2
{0}; ใช้งานได้ดี C99 [$ 6.7.8 / 21] หากมี initializers น้อยกว่าในรายการที่มีวงเล็บปิดล้อมกว่ามีองค์ประกอบหรือสมาชิกของการรวมหรือน้อยกว่าตัวอักษรในสตริงตัวอักษรที่ใช้ในการเริ่มต้นอาร์เรย์ขนาดที่รู้จักกว่ามี องค์ประกอบในอาร์เรย์ส่วนที่เหลือของการรวมจะต้องเริ่มต้นโดยนัยเช่นเดียวกับวัตถุที่มีระยะเวลาการจัดเก็บแบบคงที่
Sasha Zezulinsky

โปรดดูที่: เริ่มต้น 0 characterไม่ได้เป็น integerมันเป็น
Yonggoo Noh

1
{}การอภิปราย: stackoverflow.com/questions/17589533/ … memsetไม่ถูกต้อง: ฉันคิดว่ามันใช้ได้เฉพาะกับ 0: stackoverflow.com/questions/11138188/…
Ciro Santilli 郝海东冠状病病事件事件

1
ถ้าเป็นอาร์เรย์ของ structs และใช้เป็น-Werror=missing-bracesgcc ต้องเริ่มต้น{{0}}ด้วย หากองค์ประกอบแรกคือโครงสร้างอื่น ๆ แล้ว{{{0}}}และอื่น ๆ ดูstackoverflow.com/questions/5434865/…
Tor Klingberg

1
วันนี้ฉันเจอสิ่งแปลก ๆ ... int arr[256]={1,2,7,{0}};... ซึ่งพาฉันมาที่นี่ ไม่รู้ด้วยซ้ำว่าการ zeroing นี้เป็นสิ่งที่ฉันเห็น
Neil Gatenby

32

หากคุณต้องการเริ่มต้นอาร์เรย์เป็นค่าอื่นที่ไม่ใช่ 0 gccคุณสามารถทำได้:

int array[1024] = { [ 0 ... 1023 ] = -1 };

นี้เป็นส่วนขยายของ GNU ของ C99 Designated Initializers ใน GCC ที่เก่ากว่าคุณอาจต้องใช้-std=gnu99ในการรวบรวมรหัสของคุณ


14
initializers ที่กำหนดเป็นมาตรฐานใน C99 การใช้...เพื่อแสดงช่วงเป็นส่วนขยายเฉพาะ gcc
Keith Thompson

1
ที่ไม่ C99 กำหนดค่าเริ่มต้นมันเป็น GCC-เฉพาะช่วงการเริ่มต้น ทำไมต้องศึกษาคู่มือ GCC แทนมาตรฐาน C99
Craig Barnes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.