คำถามติดแท็ก c

C เป็นภาษาโปรแกรมทั่วไปที่ใช้สำหรับการเขียนโปรแกรมระบบ (ระบบปฏิบัติการและฝังตัว), ห้องสมุด, เกมและข้ามแพลตฟอร์ม แท็กนี้ควรใช้กับคำถามทั่วไปที่เกี่ยวข้องกับภาษา C ตามที่กำหนดไว้ในมาตรฐาน ISO 9899 (เวอร์ชันล่าสุด 9899: 2018 เว้นแต่ระบุไว้เป็นอย่างอื่น - นอกจากนี้ยังติดแท็กคำขอเฉพาะรุ่นด้วย c89, c99, c11 ฯลฯ ) C แตกต่างจาก C ++ และไม่ควรใช้ร่วมกับแท็ก C ++ หากไม่มีเหตุผล

13
ขนาดของ C“ int” 2 ไบต์หรือ 4 ไบต์หรือไม่
ตัวแปรเลขจำนวนเต็มใน C ใช้ 2 ไบต์หรือ 4 ไบต์หรือไม่ อะไรคือปัจจัยที่ขึ้นอยู่กับอะไร หนังสือเรียนส่วนใหญ่บอกว่าตัวแปรจำนวนเต็มมี 2 ไบต์ แต่เมื่อฉันรันโปรแกรมที่พิมพ์ที่อยู่ต่อเนื่องของอาร์เรย์จำนวนเต็มมันจะแสดงความแตกต่างของ 4
169 c  int  byte 


6
ใน C เหตุใดบางคนเหวี่ยงตัวชี้ก่อนที่จะปล่อย
ฉันกำลังทำงานกับฐานรหัสเก่าและทุก ๆ การเรียกใช้ฟรี () ใช้การส่งผ่านการโต้แย้ง ตัวอย่างเช่น, free((float *)velocity); free((float *)acceleration); free((char *)label); โดยที่ตัวชี้แต่ละตัวเป็นประเภทที่ตรงกัน (และการจับคู่) ฉันไม่เห็นจุดที่จะทำสิ่งนี้เลย มันเป็นรหัสเก่ามากดังนั้นฉันจึงสงสัยว่ามันจะเป็นของ K&R หรือเปล่า ถ้าเป็นเช่นนั้นฉันต้องการสนับสนุนคอมไพเลอร์ตัวเก่าที่อาจจำเป็นต้องใช้ดังนั้นฉันจึงไม่ต้องการลบออก มีเหตุผลทางเทคนิคในการใช้การปลดเปลื้องเหล่านี้หรือไม่ ฉันไม่เห็นเหตุผลที่ใช้ประโยชน์ได้มากนัก อะไรคือจุดที่ทำให้เรานึกถึงประเภทข้อมูลที่ถูกต้องก่อนที่จะทำให้เป็นอิสระ แก้ไข: คำถามนี้ไม่ได้ซ้ำกับคำถามอื่น คำถามอื่นเป็นกรณีพิเศษของคำถามนี้ซึ่งฉันคิดว่าชัดเจนว่าผู้มีสิทธิเลือกตั้งอย่างใกล้ชิดจะอ่านคำตอบทั้งหมดหรือไม่ Colophon: ฉันจะให้เครื่องหมายถูก "ตอบ const" เพราะมันเป็นเหตุผลที่แท้จริงที่ทำให้ต้องมีเหตุผลที่แท้จริงว่าทำไมต้องทำสิ่งนี้ อย่างไรก็ตามคำตอบเกี่ยวกับการเป็น pre-ANSI C ที่กำหนดเอง (อย่างน้อยในบรรดาโปรแกรมเมอร์) ดูเหมือนจะเป็นเหตุผลที่ใช้ในกรณีของฉัน จุดที่ดีมากมายจากคนมากมายที่นี่ ขอบคุณสำหรับการสนับสนุนของคุณ
167 c  pointers  casting 

9
เหตุใดความผันผวนจึงไม่ถือว่ามีประโยชน์ในการเขียนโปรแกรม C หรือ C ++ แบบมัลติเธรด
ดังที่แสดงในคำตอบที่ฉันเพิ่งโพสต์เมื่อเร็ว ๆ นี้ดูเหมือนว่าฉันจะสับสนเกี่ยวกับยูทิลิตี้ (หรือขาดของมัน) volatileในบริบทการเขียนโปรแกรมแบบมัลติเธรด volatileความเข้าใจของฉันนี้เวลาใดตัวแปรอาจมีการเปลี่ยนแปลงนอกไหลของการควบคุมของชิ้นส่วนของรหัสเข้าถึงมันว่าตัวแปรที่ควรได้รับการประกาศให้เป็น ตัวจัดการสัญญาณการลงทะเบียน I / O และตัวแปรที่แก้ไขโดยเธรดอื่นทั้งหมดล้วนเป็นสถานการณ์ดังกล่าว ดังนั้นถ้าคุณมี int ส่วนกลางfooและfooถูกอ่านโดยหนึ่งเธรดและตั้งค่าเป็นอะตอมต่อโดยเธรดอื่น (อาจใช้คำสั่งเครื่องที่เหมาะสม) เธรดการอ่านจะเห็นสถานการณ์นี้ในแบบเดียวกับที่มันเห็นตัวแปร tweaked โดยตัวจัดการสัญญาณหรือ แก้ไขโดยเงื่อนไขฮาร์ดแวร์ภายนอกและดังนั้นจึงfooควรประกาศvolatile(หรือสำหรับสถานการณ์แบบมัลติเธรดเข้าถึงได้ด้วยโหลดหน่วยความจำไม่พอใจซึ่งน่าจะเป็นทางออกที่ดีกว่า) ฉันผิดและอยู่ที่ไหน

9
มีการแทนที่สำหรับ unistd.h สำหรับ Windows (Visual C) หรือไม่
ฉันกำลังย้ายโปรแกรมคอนโซลที่ค่อนข้างง่ายซึ่งเขียนขึ้นสำหรับ Unix ไปยังแพลตฟอร์ม Windows ( Visual C ++ 8.0 ) ไฟล์ต้นฉบับทั้งหมดมี "unistd.h" ซึ่งไม่มีอยู่ การลบออกฉันได้รับการร้องเรียนเกี่ยวกับการพลาดต้นแบบสำหรับ 'srandom', 'random' และ 'getopt' ฉันรู้ว่าฉันสามารถแทนที่ฟังก์ชั่นแบบสุ่มและฉันค่อนข้างมั่นใจว่าฉันสามารถค้นหา / แฮ็กอัพการใช้งาน getopt แต่ฉันแน่ใจว่าคนอื่น ๆ ได้พบกับความท้าทายเดียวกัน คำถามของฉันคือ: มีพอร์ต "unistd.h" กับ Windows หรือไม่ อย่างน้อยหนึ่ง containg ฟังก์ชั่นเหล่านั้นที่มีการใช้งาน Windows พื้นเมือง - ฉันไม่ต้องการท่อหรือฟอร์ก แก้ไข : ฉันรู้ว่าฉันสามารถสร้าง "unistd.h" ของตัวเองซึ่งมีการแทนที่สิ่งที่ฉันต้องการ - โดยเฉพาะในกรณีนี้เนื่องจากเป็นชุดที่ จำกัด แต่เนื่องจากดูเหมือนว่าเป็นปัญหาทั่วไปฉันจึงสงสัยว่ามีบางคนทำงานให้ฟังก์ชั่นย่อยที่ใหญ่กว่านี้อยู่แล้ว การสลับไปใช้คอมไพเลอร์หรือสภาพแวดล้อมที่แตกต่างกันเป็นไปไม่ได้ในที่ทำงาน - ฉันติดอยู่กับ …
165 c++  c  windows  portability  unistd.h 

18
อัลกอริธึมการค้นหาสตริงย่อยที่เร็วที่สุดคืออะไร
ตกลงดังนั้นฉันไม่ฟังเหมือนคนงี่เง่าฉันจะระบุปัญหา / ข้อกำหนดเพิ่มเติมอย่างชัดเจน: Needle (pattern) และ haystack (text to search) เป็นทั้งสตริง C-style ที่สิ้นสุดด้วยค่า null ไม่มีข้อมูลความยาวให้; หากจำเป็นจะต้องคำนวณ ฟังก์ชั่นควรกลับตัวชี้ไปที่การแข่งขันครั้งแรกหรือNULLหากไม่พบการแข่งขัน ไม่อนุญาตให้ใช้กรณีที่ล้มเหลว ซึ่งหมายความว่าอัลกอริทึมใด ๆ ที่มีความต้องการพื้นที่เก็บข้อมูลไม่คงที่ (หรือขนาดใหญ่คงที่) จะต้องมีกรณีสำรองสำหรับความล้มเหลวในการจัดสรร การใช้งานจะต้องอยู่ใน C แม้ว่าคำอธิบายที่ดีของอัลกอริทึม ... รวมถึงสิ่งที่ฉันหมายถึงโดย "เร็วที่สุด": กำหนดO(n)ที่n= ความยาวกองหญ้า (แต่อาจเป็นไปได้ที่จะใช้แนวคิดจากอัลกอริทึมซึ่งโดยปกติO(nm)(ตัวอย่างเช่นแฮชการกลิ้ง) หากรวมกับอัลกอริธึมที่แข็งแกร่งกว่าเพื่อให้ได้O(n)ผลลัพธ์ที่กำหนดขึ้นมา ไม่เคยทำ (วัดได้; นาฬิกาสองสามนาฬิกาif (!needle[1])ฯลฯ ไม่เป็นไร) แย่กว่าอัลกอริธึมกำลังเดรัจฉานไร้เดียงสาโดยเฉพาะอย่างยิ่งในเข็มสั้น ๆ ซึ่งน่าจะเป็นกรณีที่พบบ่อยที่สุด (ค่าโสหุ้ยการประมวลผลล่วงหน้าที่ไม่มีเงื่อนไขอย่างหนักนั้นไม่ดีเช่นเดียวกับที่พยายามปรับปรุงค่าสัมประสิทธิ์เชิงเส้นสำหรับเข็มทางพยาธิวิทยาด้วยค่าใช้จ่ายของเข็มที่มีแนวโน้ม) ได้รับเข็มและกองหญ้าโดยพลการประสิทธิภาพเทียบเคียงหรือดีกว่า (ไม่เลวร้ายยิ่งกว่าการค้นหานานกว่า 50%) เทียบกับอัลกอริทึมที่ใช้งานกันอย่างแพร่หลายอื่น ๆ นอกเหนือจากเงื่อนไขเหล่านี้ฉันยังคงนิยามคำว่า "เร็วที่สุด" ที่เปิดกว้าง …
165 c  algorithm  string  substring 

4
ทำไมต้อง i ++ ผม--; หลังจากแต่ละอื่น ๆ ?
ฉันกำลังดูซอร์สโค้ดสำหรับnmapที่เปิดตัวในปี 1997 และฉันสังเกตเห็นรหัสส่วนนี้ที่ดูแปลกสำหรับฉัน: int i=0, j=0,start,end; char *expr = strdup(origexpr); ports = safe_malloc(65536 * sizeof(short)); i++; /* <<<<<< */ i--; /* <<<<<< */ for(;j < exlen; j++) if (expr[j] != ' ') expr[i++] = expr[j]; expr[i] = '\0'; ทำไมคุณถึงมีi++;และi--;หลังจากนั้นกัน? iเป็น0แล้วi++จะเปลี่ยนไปi 1หลังจากนั้นi--จะเปลี่ยนไปi0 ลิงก์ไปยังซอร์สโค้ดต้นฉบับ ค้นหา: i++; i--; ทุกคนสามารถอธิบายสิ่งนี้มีไว้เพื่ออะไร?
164 c  nmap 

20
“ สำหรับ (;;)” เร็วกว่า“ ขณะ (TRUE)” หรือไม่ ถ้าไม่ทำไมผู้คนถึงใช้มัน?
for (;;) { //Something to be done repeatedly } ฉันเคยเห็นสิ่งต่าง ๆ นี้ใช้บ่อย แต่ฉันคิดว่ามันค่อนข้างแปลก ... มันจะไม่ชัดเจนกว่าที่จะพูดwhile(true)หรือบางสิ่งบางอย่างตามสายเหล่านั้น? ฉันเดาว่า (เช่นเดียวกับเหตุผลที่โปรแกรมเมอร์หลายคนหันไปใช้รหัสลับ) นี่เป็นอัตรากำไรขั้นต้นที่น้อยกว่าหรือไม่ ทำไมและมันคุ้มค่าจริงหรือ ถ้าเป็นเช่นนั้นทำไมไม่กำหนดเพียงวิธีนี้: #define while(true) for(;;) ดูเพิ่มเติม: อันไหนเร็วกว่าในขณะที่ (1) หรือขณะที่ (2)?

3
ฉันจะตั้งค่าเบรกพอยต์แบบมีเงื่อนไขใน gdb ได้อย่างไรเมื่อ char * x ชี้ไปยังสตริงที่มีค่าเท่ากับ "hello"
ฉันสามารถระบุว่าฉันต้องการให้ gdb แตกที่บรรทัด x เมื่อchar* xชี้ไปที่สตริงที่มีค่าเท่ากับ"hello"หรือไม่ ถ้าใช่เป็นอย่างไร

4
คำเตือน: การประกาศโดยนัยที่เข้ากันไม่ได้ของฟังก์ชันในตัว 'xyz'
ฉันได้รับคำเตือนจำนวนหนึ่งเมื่อรวบรวมไบนารีสองสาม: warning: incompatible implicit declaration of built-in function ‘strcpy’ warning: incompatible implicit declaration of built-in function ‘strlen’ warning: incompatible implicit declaration of built-in function ‘exit’ เพื่อพยายามแก้ไขปัญหานี้ฉันได้เพิ่ม #include <stdlib.h> ที่ด้านบนของไฟล์ C ที่เกี่ยวข้องกับคำเตือนนี้นอกเหนือจากการรวบรวมด้วยแฟล็กต่อไปนี้: CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc ฉันใช้ GCC 4.1.2: $ gcc --version gcc (GCC) 4.1.2 20080704 ฉันควรทำอย่างไรเพื่อแก้ไขคำเตือนเหล่านี้
164 c  gcc  gcc-warning 

24
แมโคร __FILE__ แสดงเส้นทางแบบเต็ม
แมโครมาตรฐานที่กำหนดไว้ล่วงหน้าที่__FILE__มีอยู่ใน C แสดงพา ธ เต็มไปยังไฟล์ มีวิธีใดที่จะทำให้เส้นทางสั้นลงหรือไม่ ฉันหมายถึงแทนที่จะ /full/path/to/file.c ฉันเห็น to/file.c หรือ file.c
164 c  file  macros  path 

5
__attribute __ ของ gcc เป็น (บรรจุแล้ว) / #pragma ไม่ปลอดภัยหรือไม่
ใน C คอมไพเลอร์จะวางโครงสมาชิกของโครงสร้างตามลำดับที่ประกาศโดยมีการเติมไบต์ที่เป็นไปได้แทรกระหว่างสมาชิกหรือหลังสมาชิกรายสุดท้ายเพื่อให้แน่ใจว่าสมาชิกแต่ละคนได้รับการจัดตำแหน่งอย่างถูกต้อง gcc จัดเตรียมส่วนขยายของภาษา__attribute__((packed))ซึ่งบอกคอมไพเลอร์ว่าไม่ให้แทรกการซ้อนทำให้สมาชิกโครงสร้างไม่ถูกต้อง ตัวอย่างเช่นถ้าระบบต้องการintวัตถุทั้งหมดที่มีการจัดตำแหน่งแบบ 4 ไบต์__attribute__((packed))สามารถทำให้intสมาชิก struct ได้รับการจัดสรรที่ออฟเซ็ตแปลก ๆ การอ้างอิงเอกสาร gcc: แอตทริบิวต์ `ที่บรรจุ 'ระบุว่าเขตข้อมูลตัวแปรหรือโครงสร้างควรมีการจัดตำแหน่งที่เล็กที่สุดที่เป็นไปได้ - หนึ่งไบต์สำหรับตัวแปรและหนึ่งบิตสำหรับเขตข้อมูลเว้นแต่ว่าคุณจะระบุค่าที่มากขึ้นด้วยแอตทริบิวต์` จัดชิด' เห็นได้ชัดว่าการใช้ส่วนขยายนี้อาจส่งผลให้ข้อกำหนดด้านข้อมูลมีขนาดเล็กลง แต่มีโค้ดที่ช้ากว่าเนื่องจากคอมไพเลอร์จะต้องสร้างรหัสเพื่อเข้าถึงสมาชิกไบต์ที่ไม่ถูกต้องในแต่ละครั้ง แต่มีกรณีใดบ้างที่สิ่งนี้ไม่ปลอดภัยหรือไม่? คอมไพเลอร์สร้างรหัสที่ถูกต้อง (แม้ว่าช้ากว่า) เสมอเพื่อเข้าถึงสมาชิกที่มีโครงสร้างไม่ตรงตามที่กำหนดหรือไม่? เป็นไปได้ไหมที่จะทำเช่นนั้นในทุกกรณี?
164 c  gcc  pragma-pack 

6
วิธีรับไดเรกทอรีปัจจุบันในโปรแกรม C
ฉันกำลังสร้างโปรแกรม C ที่ฉันต้องการรับไดเรกทอรีที่โปรแกรมนั้นเริ่มต้น โปรแกรมนี้เขียนขึ้นสำหรับคอมพิวเตอร์ UNIX ฉันได้รับการดูopendir()และtelldir()แต่telldir()ส่งกลับoff_t (long int)ดังนั้นจริงๆมันไม่ช่วยฉัน ฉันจะรับเส้นทางปัจจุบันในสตริง (อาร์เรย์ char) ได้อย่างไร

13
D เป็นทางเลือกที่น่าเชื่อถือสำหรับ Java และ C ++ หรือไม่ [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องการอภิปรายการโต้แย้งการหยั่งเสียงหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา เป็นภาษา Dเป็นทางเลือกที่น่าเชื่อถือ Java และ C ++? อะไรจะเป็นทางเลือกที่น่าเชื่อถือ ฉันควรจะรบกวนการเรียนรู้หรือไม่? สมควรได้รับการประกาศข่าวประเสริฐหรือไม่ เหตุผลหลักที่ฉันถามคือด้วยมาตรฐาน C ++ ใหม่ (c ++ 0x) เกือบที่นี่มันชัดเจนสำหรับฉันว่าภาษาได้ผ่านจุดที่ไม่กลับมาด้วยความเคารพกับทุกคนที่เคยเข้าใจมัน ฉันรู้ว่า C / C ++ จะไม่มีวันตาย แต่ในบางจุดเราจำเป็นต้องดำเนินการต่อไป แม้กระทั่ง COBOL ก็มีวันและ Java มีหลายประการเลิก C ++ แล้วจะมีอะไรต่อไป D เติมใบเรียกเก็บเงินหรือไม่?
163 java  c++  c  d 


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.