วิธีการเตรียมใช้งาน struct ตามมาตรฐานภาษาโปรแกรม C


466

ฉันต้องการเริ่มต้นองค์ประกอบ struct แยกในการประกาศและการเริ่มต้น นี่คือสิ่งที่ฉันมี:

typedef struct MY_TYPE {
  bool flag;
  short int value;
  double stuff;
} MY_TYPE;

void function(void) {
  MY_TYPE a;
  ...
  a = { true, 15, 0.123 }
}

นี่เป็นวิธีในการประกาศและกำหนดค่าเริ่มต้นตัวแปรท้องถิ่นMY_TYPEให้สอดคล้องกับมาตรฐานภาษาโปรแกรม C หรือไม่ (C89, C90, C99, C11 และอื่น ๆ ) หรือมีอะไรที่ดีขึ้นหรืออย่างน้อยก็ทำงานได้ดี

อัปเดตฉันสิ้นสุดลงด้วยองค์ประกอบเริ่มต้นคงที่ที่ฉันตั้งทุกองค์ประกอบย่อยตามความต้องการของฉัน


3
คุณควรยอมรับคำตอบที่ดีกว่านี้ฉันเห็นว่าคุณต้องใช้คู่มือการเขียนโค้ดที่ไม่ดี แต่คุณก็ไม่ควรแนะนำให้คนอื่นเห็นว่าเป็นวิธีที่เหมาะสมที่จะทำ ..
Karoly Horvath

@ KarolyHorvath ดีคำตอบที่ดีส่วนใหญ่เฉพาะ C99 บางทีคำถามของฉันอาจซ้ำกับstackoverflow.com/questions/6624975/… ?
ประจบประแจง

ถ้านั่นเป็นความตั้งใจดั้งเดิมของคุณก็อาจจะใช่ แต่แล้ว 1) การโหวตจะทำให้เข้าใจผิดมาก 2) จากการค้นหายอดนิยมอันดับนี้เป็นสิ่งเดียวที่แสดงให้เห็นถึงวิธีการ C99 ..... มันจะดีกว่าที่จะใช้หน้านี้ซ้ำสำหรับการสาธิต C99 ... (เห็นได้ชัดว่าผู้คนเริ่มเชื่อมโยงหน้านี้เพื่อแสดงวิธีการ ทำมัน)
Karoly Horvath

10
ที่น่าสนใจว่าคำตอบที่ยอมรับ (และมีการอัปเดตอย่างมาก) ไม่ได้ตอบคำถามแม้จะโพสต์ในตอนแรก initializers ที่กำหนดไม่ได้แก้ไขปัญหาของ OP ซึ่งเป็นการแยกการประกาศจากการกำหนดค่าเริ่มต้น สำหรับ pre-1999 C ทางออกที่แท้จริงเท่านั้นคือกำหนดให้กับสมาชิกแต่ละคน สำหรับ C99 และต่อมาตัวอักษรผสมเช่นเดียวกับในคำตอบของ CesarB คือคำตอบ (แน่นอนว่า initializer ที่แท้จริงที่มีหรือไม่มีผู้ออกแบบจะดีกว่า แต่เห็นได้ชัดว่า OP ได้รับอานิสงส์ด้วยมาตรฐานการเข้ารหัสที่แย่มาก ๆ )
Keith Thompson

32
อย่างเคร่งครัดคำว่า "ANSI C" ตอนนี้อ้างถึงมาตรฐาน ISO 2011 ซึ่ง ANSI ได้นำมาใช้ แต่ในทางปฏิบัติคำว่า "ANSI C" โดยทั่วไปหมายถึงมาตรฐาน (ล้าสมัยอย่างเป็นทางการ) 1989 ตัวอย่างเช่น "gcc -ansi" ยังคงบังคับใช้มาตรฐานปี 1989 เนื่องจากเป็น ISO ที่เผยแพร่มาตรฐานปี 1990, 1999 และ 2011 จึงควรหลีกเลี่ยงคำว่า "ANSI C" และอ้างอิงวันที่มาตรฐานหากมีความเป็นไปได้ที่จะเกิดความสับสน
Keith Thompson

คำตอบ:


728

ใน (ANSI) C99 คุณสามารถใช้initializer ที่กำหนดเพื่อเริ่มต้นโครงสร้าง:

MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 };

แก้ไข: สมาชิกอื่น ๆ ถูกกำหนดค่าเริ่มต้นเป็นศูนย์: "สมาชิกของฟิลด์ที่ละเว้นถูกเตรียมใช้งานโดยนัยเหมือนกับวัตถุที่มีระยะเวลาการจัดเก็บแบบคงที่" ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )


87
ยอดเยี่ยมขอบคุณ คุณสามารถทำรัง em: static oxeRay2f ray = {.unitDir = {.x = 1.0f, .y = 0.0f}};
orion elenzil

4
นี่ไม่ได้ตอบคำถามเลย OP ต้องการแยกการกำหนดค่าเริ่มต้นจากการประกาศ
osvein

3
C99! = ANSI C - ดังนั้นสิ่งนี้จะไม่ทำงานใน C89 หรือใน C90
Tim Wißmann

3
C99 คือ ANSI C ให้ดูสิ่งนี้
Cutberto Ocampo

3
@CutbertoOcampo ฉันเข้าใจว่าเกิดอะไรขึ้นตอนนี้ คำถามเดิมกำลังขอคำตอบใน ANSI C แน่นอนว่าเขาต้องการคำตอบสำหรับ C89 เท่านั้น ในปี 2559 คำถามได้รับการแก้ไขและ "ANSI C" ถูกลบออกซึ่งตอนนี้ทำให้ยากที่จะเข้าใจว่าทำไมคำตอบและความคิดเห็นนี้จึงกล่าวถึง "(ANSI) C99"
Étienne

198

คุณสามารถทำมันด้วยตัวอักษรผสม ตามหน้านั้นมันทำงานใน C99 (ซึ่งยังนับเป็นANSI C )

MY_TYPE a;

a = (MY_TYPE) { .flag = true, .value = 123, .stuff = 0.456 };
...
a = (MY_TYPE) { .value = 234, .stuff = 1.234, .flag = false };

การกำหนดใน initializers เป็นทางเลือก คุณสามารถเขียน:

a = (MY_TYPE) { true,  123, 0.456 };
...
a = (MY_TYPE) { false, 234, 1.234 };

ดังนั้น initializers ที่กำหนดไว้ใช้สำหรับเมื่อคุณประกาศและกำหนดในเวลาเดียวกัน แต่ตัวอักษรผสมใช้สำหรับเมื่อคุณกำหนดตัวแปรที่ประกาศแล้ว?
Geremia

@Geremia คุณต้องกำหนด struct ในทั้งสองกรณีก่อน แต่ด้วย initializers ที่กำหนดไว้คุณทำให้โค้ดอ่านง่ายขึ้นและยืดหยุ่นต่อข้อผิดพลาดมากขึ้นในกรณีที่มีการเปลี่ยนแปลงใน struct
hoijui

2
นี่เป็นเรื่องยุ่งยากเล็กน้อย หลายครั้ง (บางคนที่ประสบความสำเร็จ) ฉันพยายามใช้ initializers ที่กำหนด อย่างไรก็ตามตอนนี้มันชัดเจนเท่านั้น (ต้องขอบคุณตัวอย่างของคุณและ @ philant) ที่จะต้องมีการร่ายอยู่หากไม่ได้ใช้ initializer ในเวลาที่สร้างวัตถุ แต่ผมมีตอนนี้ยังได้เรียนรู้ว่าถ้า initializers ถูกนำมาใช้ในช่วงเวลาอื่น ๆ นอกเหนือจากการสร้างวัตถุ (เช่นในตัวอย่างของคุณ) แล้วมันจะเรียกว่าเป็นตัวอักษรผสม , ไม่เคร่งครัดinitializer กำหนด ideone.com/Ze3rnZ
sherrellbc

93

ฉันเห็นว่าคุณได้รับคำตอบเกี่ยวกับ ANSI C 99 แล้วดังนั้นฉันจะโยนกระดูกเกี่ยวกับ ANSI C 89 ANSI C 89 ช่วยให้คุณเริ่มต้น struct ด้วยวิธีนี้:

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = { 5, 2.2, "George" };
    return 0;
}

สิ่งสำคัญที่ต้องจำไว้ในขณะที่คุณเริ่มต้นแม้แต่วัตถุ / ตัวแปรหนึ่งตัวใน struct ตัวแปรอื่น ๆ ทั้งหมดของมันจะเริ่มต้นเป็นค่าเริ่มต้น

หากคุณไม่ได้เริ่มต้นค่าใน struct ของคุณตัวแปรทั้งหมดจะมี "ค่าขยะ"

โชคดี!


3
เป็นไปได้ไหมที่จะใช้ตัวแปรในการเริ่มต้น?
สีฟ้า

2
@Cyan มันมีไว้สำหรับวัตถุที่มีระยะเวลาการจัดเก็บอัตโนมัติ ดู 6.7.9 13) ในopen-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf สำหรับวัตถุระดับโลกนั้นค่อนข้าง จำกัด อยู่ที่ตัวอักษร คุณไม่สามารถใช้วัตถุส่วนกลางอื่น ๆ ได้แม้ว่าจะเป็นวัตถุ
PSkocik

ดังนั้นความแตกต่างเพียงอย่างเดียวกับ C 99 คือคุณไม่สามารถระบุชื่อได้?
Akaisteph7

42

a = (MYTYPE){ true, 15, 0.123 };

จะทำอะไรดีใน C99


1
ฉันคิดว่าคำตอบนั้นเป็นคำตอบที่มีประโยชน์ที่สุดอย่างแท้จริง
user12211554

22

คุณเกือบจะได้รับมัน ...

MY_TYPE a = { true,15,0.123 };

การค้นหา อย่างรวดเร็วของ 'struct initialize c' แสดงให้ฉันเห็น


1
ฉันคิดว่านี่เป็นจริงสำหรับมาตรฐาน C แต่ไม่ใช่สำหรับ ANSI C (99?) นอกจากนี้ฉันต้องปฏิบัติตามกฎการเข้ารหัสที่จะไม่อนุญาตให้ฉันประกาศและกำหนดค่าเริ่มต้นพร้อมกันดังนั้นฉันจึงต้องแยกมันออกและกำหนดค่าเริ่มต้นทุก ๆ องค์ประกอบย่อย
ประจบประแจง

8
การเริ่มต้นสามารถเกิดขึ้นได้ที่จุดประกาศเท่านั้น นั่นคือความหมายของการ 'เริ่มต้น' มิฉะนั้นคุณจะอนุญาตให้ค่าที่ไม่ได้กำหนดเป็นค่าเริ่มต้นของตัวแปร / struct ของคุณแล้วกำหนดค่าในภายหลัง
Kieveli

8
อืม ... คุณมีกฎการเข้ารหัสที่ไม่ดีอย่างตั้งใจหรือไม่? บางทีคุณควรแนะนำคนที่เขียนพวกเขาไปที่ "การได้มาซึ่งทรัพยากรเป็นการเริ่มต้น" ( en.wikipedia.org/wiki/RAII )
James Curran

เชื่อใจฉันจริง ๆ แล้วไม่สามารถเปลี่ยนกฎนี้ได้ในตอนนี้ มันรู้สึกแย่ที่จะเขียนมัน และยังมีกฎอื่นอีกมากมายในยุค 70 เช่นส่วนหัวของรหัสคงที่พร้อมข้อมูลการจัดการเช่นหมายเลขการแก้ไข การเปลี่ยนแปลงสำหรับทุกรุ่นแม้ว่าแหล่งที่มาจะไม่เปลี่ยนแปลง ...
ประจบประแจง

19

การเขียนโปรแกรมภาษา C มาตรฐานISO / IEC 9899: 1999 (หรือที่รู้จักกันทั่วไปว่า C99) อนุญาตให้ใช้initializer ที่กำหนดเพื่อเริ่มต้นสมาชิกของโครงสร้างหรือยูเนี่ยนดังนี้

MY_TYPE a = { .stuff = 0.456, .flag = true, .value = 123 };

มันถูกกำหนดไว้ในparagraph 7ส่วน6.7.8 Initializationของมาตรฐาน ISO / IEC 9899: 1999 เป็น:

หากผู้ออกแบบมีแบบฟอร์ม
มีรูปแบบ ตัวระบุ
แล้ววัตถุปัจจุบัน (กำหนดไว้ด้านล่าง) จะต้องมีโครงสร้างหรือประเภทสหภาพและตัวระบุจะต้องเป็นชื่อของสมาชิกประเภทนั้น

สังเกตได้ว่า paragraph 9ในส่วนเดียวกันระบุว่า:

ยกเว้นที่ระบุไว้อย่างชัดเจนเป็นอย่างอื่นสำหรับวัตถุประสงค์ของการย่อยนี้สมาชิกที่ไม่มีชื่อของวัตถุของโครงสร้างและประเภทของสหภาพไม่ได้มีส่วนร่วมในการเริ่มต้น สมาชิกที่ไม่มีชื่อของวัตถุโครงสร้างมีค่าไม่แน่นอนแม้หลังจากการเริ่มต้น

ในการนำ GNU GCC ไปใช้อย่างไรก็ตามสมาชิกที่ข้ามไปจะถูกกำหนดค่าเริ่มต้นให้เป็นค่าที่เหมาะสมสำหรับประเภทที่เป็นศูนย์หรือไม่เป็นศูนย์ ตามที่ระบุในส่วน6.27 การกำหนดค่าเริ่มต้นของเอกสาร GNU GCC

ละเว้นฟิลด์สมาชิกถูกเตรียมใช้งานโดยนัยเหมือนกับวัตถุที่มีระยะเวลาการจัดเก็บแบบคงที่

Microsoft Visual c ++ คอมไพเลอร์ควรสนับสนุน initializers กำหนดตั้งแต่รุ่น 2013 ตามโพสต์บล็อกอย่างเป็นทางการc ++ สอดคล้อง Roadmap ย่อหน้าInitializing unions and structsของบทความเริ่มต้นที่เอกสาร MSDN Visual Studio แสดงให้เห็นว่าสมาชิกที่ไม่มีชื่อถูกกำหนดค่าเริ่มต้นให้เป็นค่าที่เหมาะสมเหมือนศูนย์เหมือนกับ GNU GCC

มาตรฐาน ISO / IEC 9899: 2011มาตรฐาน (ที่รู้จักกันทั่วไปว่าเป็น C11) ซึ่งแทนที่มาตรฐาน ISO / IEC 9899: 1999 ยังคงมีกำหนด initializers 6.7.9 Initializationตามมาตรา มันยังคงparagraph 9ไม่เปลี่ยนแปลง

ใหม่มาตรฐาน ISO / IEC 9899: 2018มาตรฐาน (ที่รู้จักกันทั่วไปว่าเป็น C18) ซึ่งแทนที่มาตรฐาน ISO / IEC 9899: 2011 ยังคงมีกำหนด initializers 6.7.9 Initializationตามมาตรา มันยังคงparagraph 9ไม่เปลี่ยนแปลง


3
เริ่มแรกฉันแนะนำสิ่งนี้เป็นการแก้ไขคำตอบที่ยอมรับ แต่มันถูกปฏิเสธ ดังนั้นฉันโพสต์มันเป็นคำตอบ
PF4Public

ผมเชื่อว่า "ไม่มีชื่อสมาชิก" ไม่ได้หมายความว่า "ทุ่งละเว้น" แต่ "สมาชิกที่ไม่ระบุชื่อ" struct thing { union { char ch; int i; }; };เช่นสหภาพใน มาตรฐานกล่าวในภายหลังว่า: "หากมี initializers น้อยกว่าในรายการที่มีวงเล็บปิดล้อมกว่ามีองค์ประกอบหรือสมาชิกของการรวมหรือน้อยกว่าตัวอักษรในสตริงตัวอักษรที่ใช้ในการเริ่มต้นอาร์เรย์ขนาดที่รู้จักกว่ามีองค์ประกอบในอาร์เรย์ ส่วนที่เหลือของการรวมจะต้องเริ่มต้นโดยปริยายเช่นเดียวกับวัตถุที่มีระยะเวลาการจัดเก็บแบบคงที่ "
emersion

14

ในขณะที่ Ron Nuni กล่าวว่า:

typedef struct Item {
    int a;
    float b;
    char* name;
} Item;

int main(void) {
    Item item = {5, 2.2, "George"};
    return 0;
}

สิ่งสำคัญที่ต้องจำ: ในขณะที่คุณเตรียมใช้งานวัตถุ / ตัวแปรแม้แต่หนึ่งตัวในโครงสร้างตัวแปรอื่น ๆ ทั้งหมดจะถูกกำหนดเป็นค่าเริ่มต้น

หากคุณไม่ได้เริ่มต้นค่าใน struct ของคุณ (เช่นถ้าคุณเพิ่งประกาศตัวแปรนั้น) ทั้งหมดvariable.membersจะมี "ค่าขยะ" เฉพาะในกรณีที่การประกาศเป็นท้องถิ่น!

หากการประกาศเป็นแบบโกลบอลหรือแบบคงที่ (เช่นในกรณีนี้) การvariable.membersกำหนดค่าเริ่มต้นทั้งหมดจะเริ่มต้นโดยอัตโนมัติไปที่:

  • 0 สำหรับจำนวนเต็มและทศนิยม
  • '\0'สำหรับchar(แน่นอนว่านี่เป็นเช่นเดียวกับ0และcharเป็นประเภทจำนวนเต็ม)
  • NULL สำหรับพอยน์เตอร์

ที่น่าสนใจเกี่ยวกับท้องถิ่น / ทั่วโลกนี้ยังใช้กับค่าเวลา struct tm ฉันมีหนึ่งในพื้นที่และในกรณีหนึ่ง DST เปิดอยู่ในที่อื่นมันไม่ได้เกิดจากสิ่งที่ฉันทำ ฉันไม่ได้ใช้ DST (ฟิลด์ tm_isdst) นี่มาจาก strptime แต่เมื่อฉันแปลงเป็น time_t บางคนหยุดทำงานหนึ่งชั่วโมง
Alan Corey

3
void function(void) {
  MY_TYPE a;
  a.flag = true;
  a.value = 15;
  a.stuff = 0.123;
}

24
เมื่อฉันได้ยิน 'การเริ่มต้นแตกต่างจากการมอบหมาย' ดังนั้นนี่ไม่ใช่การมอบหมายมากกว่าการเริ่มต้นใช่ไหม
Hayri Uğur Koltuk



2

ฉันไม่ชอบคำตอบเหล่านี้เลยฉันเลยทำเอง ฉันไม่รู้ว่านี่คือ ANSI C หรือไม่มันเป็นเพียง GCC 4.2.1 ในโหมดเริ่มต้น ฉันไม่สามารถจำการถ่ายคร่อมได้ดังนั้นฉันจึงเริ่มต้นด้วยส่วนย่อยของข้อมูลและต่อสู้กับข้อความแสดงข้อผิดพลาดคอมไพเลอร์จนกว่าจะปิด การอ่านเป็นสิ่งสำคัญอันดับแรกของฉัน

    // in a header:
    typedef unsigned char uchar;

    struct fields {
      uchar num;
      uchar lbl[35];
    };

    // in an actual c file (I have 2 in this case)
    struct fields labels[] = {
      {0,"Package"},
      {1,"Version"},
      {2,"Apport"},
      {3,"Architecture"},
      {4,"Bugs"},
      {5,"Description-md5"},
      {6,"Essential"},
      {7,"Filename"},
      {8,"Ghc-Package"},
      {9,"Gstreamer-Version"},
      {10,"Homepage"},
      {11,"Installed-Size"},
      {12,"MD5sum"},
      {13,"Maintainer"},
      {14,"Modaliases"},
      {15,"Multi-Arch"},
      {16,"Npp-Description"},
      {17,"Npp-File"},
      {18,"Npp-Name"},
      {19,"Origin"}
    };

ข้อมูลอาจเริ่มต้นชีวิตเป็นไฟล์ที่คั่นด้วยแท็บที่คุณค้นหาแทนที่เพื่อนวดเป็นอย่างอื่น ใช่นี่คือสิ่ง Debian ดังนั้นหนึ่งคู่นอกของ {} (ระบุอาร์เรย์) จากนั้นอีกคู่หนึ่งสำหรับแต่ละโครงสร้างภายใน ด้วยเครื่องหมายจุลภาคระหว่าง การวางสิ่งต่าง ๆ ไว้ในส่วนหัวนั้นไม่จำเป็นอย่างเด็ดขาด แต่ฉันมีรายการอยู่ในโครงสร้างประมาณ 50 รายการดังนั้นฉันจึงต้องการให้พวกเขาแยกเป็นไฟล์ทั้งคู่เพื่อป้องกันไม่ให้โค้ดยุ่งเหยิงและง่ายต่อการแทนที่


3
ไม่มีคำถามเกี่ยวกับการเริ่มต้นของอาร์เรย์ของโครงสร้าง! ฉันหมายความว่าคำตอบของคุณมีค่าใช้จ่าย
Victor Signaevskyi

ฉันเดาว่าจุดของฉันคือการประกาศ struct ด้วยค่าที่มีอยู่แล้วเทียบกับการใช้ = เพื่อตั้งค่าแต่ละค่าในภายหลัง
Alan Corey

หลักการนั้นใช้ไม่ว่าจะเป็นโครงสร้างเดียวหรือหลายอาร์เรย์ การใช้ = ไม่ใช่การเริ่มต้นจริง ๆ ฉันไม่คิดว่า
Alan Corey

0

โครงสร้างใน C สามารถประกาศและเริ่มต้นได้เช่นนี้

typedef struct book
{
    char title[10];
    char author[10];
    float price;
} book;

int main() {
    book b1={"DS", "Ajay", 250.0};

    printf("%s \t %s \t %f", b1.title, b1.author, b1.price);

    return 0;
}

0

ฉันได้อ่าน Microsoft Visual Studio 2015 สำหรับการเริ่มต้นประเภทรวมแล้วการเริ่มต้นด้วยทุกรูปแบบ{...}นั้นมีการอธิบายที่นั่น แต่การเริ่มต้นด้วยจุดที่มีชื่อว่า '' designator '' ไม่ได้กล่าวถึง มันไม่ทำงานด้วย

บทมาตรฐาน C99 6.7.8 การกำหนดค่าเริ่มต้นอธิบายถึงความเป็นไปได้ของผู้ออกแบบ แต่ในใจของฉันมันไม่ชัดเจนสำหรับโครงสร้างที่ซับซ้อน มาตรฐาน C99 เป็น pdf

ในใจของฉันมันอาจจะดีกว่า

  1. ใช้= {0};-initialization สำหรับข้อมูลสแตติกทั้งหมด มันเป็นความพยายามน้อยสำหรับรหัสเครื่อง
  2. ใช้แมโครเพื่อเริ่มต้นตัวอย่างเช่น

    typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}

แมโครสามารถปรับได้รายการอาร์กิวเมนต์สามารถเป็นอิสระจากเนื้อหา struct ที่เปลี่ยนแปลง มันเหมาะสมถ้าองค์ประกอบน้อยควรเริ่มต้น นอกจากนี้ยังเหมาะสำหรับโครงสร้างที่ซ้อนกัน 3. รูปแบบง่าย ๆ คือ: เริ่มต้นในรูทีนย่อย:

void init_MyStruct(MyStruct* thiz, int a, int b) {
  thiz->a = a; thiz->b = b; }

รูทีนนี้ดูเหมือนว่า ObjectOriented ใน C ใช้thizไม่thisคอมไพล์ด้วย C ++ ด้วย!

MyStruct data = {0}; //all is zero!
init_MyStruct(&data, 3, 456);

0

ฉันกำลังมองหาวิธีที่ดีในการเริ่มต้นโครงสร้างของฉันและฉันต้องใช้ด้านล่าง (C99) สิ่งนี้ให้ฉันเริ่มต้นโครงสร้างเดียวหรืออาร์เรย์ของโครงสร้างในลักษณะเดียวกับชนิดธรรมดา

typedef struct {
    char *str;
    size_t len;
    jsmntok_t *tok;
    int tsz;
} jsmn_ts;

#define jsmn_ts_default (jsmn_ts){NULL, 0, NULL, 0}

สามารถใช้ในรหัสเป็น:

jsmn_ts mydata = jsmn_ts_default; /* initialization of a single struct */

jsmn_ts myarray[10] = {jsmn_ts_default, jsmn_ts_default}; /* initialization of
                                                    first 2 structs in the array */

แต่สิ่งนี้ไม่ได้เริ่มต้นอาร์เรย์ของโครงสร้างเป็นค่าเริ่มต้น มันเริ่มต้นโครงสร้างครั้งแรกในอาร์เรย์ให้เป็นค่าที่กำหนดในjsmn_ts_defaultแต่ส่วนที่เหลือของโครงสร้างจะเริ่มต้นเช่นถ้าอาร์เรย์มีระยะเวลาในการจัดเก็บข้อมูลแบบคงที่ซึ่งหมายความว่าสมาชิกจะเริ่มต้นได้และNULL 0แต่ถ้าคุณเปลี่ยนไป#define jsmn_ts_default (jsmn_ts){"default", sizeof "default", NULL, 0}คุณจะเห็นว่ามีเพียงองค์ประกอบอาร์เรย์แรกเท่านั้นที่เริ่มต้นได้
อดีต nihilo

ใช่ฉันเพิ่งกลับมาจากการทดสอบเพิ่มเติมต้องการแก้ไขโพสต์ :) btw พฤติกรรมเดียวกันที่เกิดขึ้นกับint a[10] = {1};เฉพาะองค์ประกอบที่ 1 เท่านั้น==1
div0man
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.