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

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

18
สร้างตัวเลขสุ่มตามการแจกแจงปกติใน C / C ++
ฉันจะสร้างตัวเลขสุ่มตามการแจกแจงปกติใน C หรือ C ++ ได้อย่างไร ฉันไม่ต้องการใช้ Boost ใด ๆ ฉันรู้ว่า Knuth พูดถึงเรื่องนี้เป็นเวลานาน แต่ตอนนี้ฉันไม่มีหนังสือของเขาอยู่ในมือ

7
อะไรคือความแตกต่างระหว่าง vmalloc และ kmalloc?
ฉันได้ไปรอบ ๆ และพบว่าคนส่วนใหญ่สนับสนุนการใช้kmallocเนื่องจากคุณรับประกันได้ว่าจะได้รับบล็อกหน่วยความจำทางกายภาพที่ต่อเนื่องกัน อย่างไรก็ตามดูเหมือนว่าจะkmallocล้มเหลวหากไม่พบบล็อกทางกายภาพที่อยู่ติดกันที่คุณต้องการ ข้อดีของการมีบล็อกหน่วยความจำที่ต่อเนื่องกันคืออะไร? โดยเฉพาะทำไมฉันจะต้องมีความต่อเนื่องกันทางกายภาพบล็อกของหน่วยความจำในการเรียกระบบ ? มีเหตุผลใดบ้างที่ฉันใช้vmallocไม่ได้? สุดท้ายถ้าฉันจะจัดสรรหน่วยความจำระหว่างการจัดการการเรียกระบบฉันควรระบุGFP_ATOMICหรือไม่? การเรียกระบบดำเนินการในบริบทอะตอมหรือไม่? GFP_ATOMIC การจัดสรรมีความสำคัญสูงและไม่ได้นอนหลับ นี่คือแฟล็กที่จะใช้ในตัวจัดการขัดจังหวะครึ่งล่างและสถานการณ์อื่น ๆ ที่คุณนอนไม่หลับ GFP_KERNEL นี่เป็นการจัดสรรตามปกติและอาจปิดกั้น นี่คือแฟล็กที่จะใช้ในโค้ดบริบทกระบวนการเมื่อเข้าสู่โหมดสลีปได้อย่างปลอดภัย

4
แผ่นพิมพ์ด้านซ้ายที่มีช่องว่าง
ฉันจะวางสตริงที่มีช่องว่างทางด้านซ้ายเมื่อใช้ printf ได้อย่างไร ตัวอย่างเช่นฉันต้องการพิมพ์ "สวัสดี" โดยมีช่องว่าง 40 ช่องนำหน้า นอกจากนี้สตริงที่ฉันต้องการพิมพ์ประกอบด้วยหลายบรรทัด ฉันจำเป็นต้องพิมพ์แต่ละบรรทัดแยกกันหรือไม่? แก้ไข: เพื่อความชัดเจนฉันต้องการให้พิมพ์ 40 ช่องว่างก่อนทุกบรรทัด
114 c  formatting  printf 

13
อะไรคือสาเหตุของข้อผิดพลาดที่ปฏิเสธการเชื่อมต่อ?
ฉันกำลังพยายามเขียนโปรแกรมเซิร์ฟเวอร์ใน C โดยใช้ไคลเอนต์อื่นฉันได้รับข้อผิดพลาดนี้เมื่อพยายามเชื่อมต่อผ่านพอร์ต 2080 เช่น connection refused อะไรคือสาเหตุของข้อผิดพลาดนี้?

5
GDB เสียหาย stack frame - จะแก้จุดบกพร่องได้อย่างไร?
ฉันมีการติดตามสแต็กต่อไปนี้ เป็นไปได้ไหมที่จะทำสิ่งที่เป็นประโยชน์จากสิ่งนี้สำหรับการดีบัก? Program received signal SIGSEGV, Segmentation fault. 0x00000002 in ?? () (gdb) bt #0 0x00000002 in ?? () #1 0x00000001 in ?? () #2 0xbffff284 in ?? () Backtrace stopped: previous frame inner to this frame (corrupt stack?) (gdb) จะเริ่มดูโค้ดได้ที่ไหนเมื่อเราได้รับ a Segmentation faultและ stack trace ไม่มีประโยชน์? หมายเหตุ: หากฉันโพสต์รหัสผู้เชี่ยวชาญ SO …
113 c  recursion  gdb 

7
C99 stdint.h header และ MS Visual Studio
ด้วยความประหลาดใจของฉันฉันเพิ่งค้นพบว่า C99 stdint.h หายไปจาก MS Visual Studio 2003 ขึ้นไป ฉันแน่ใจว่าพวกเขามีเหตุผล แต่มีใครรู้บ้างว่าฉันสามารถดาวน์โหลดสำเนาได้ที่ไหน? หากไม่มีส่วนหัวนี้ฉันไม่มีคำจำกัดความสำหรับประเภทที่มีประโยชน์เช่น uint32_t เป็นต้น
113 c++  c  visual-studio  c99 

9
เป็น 'int main; โปรแกรม C / C ++ ที่ถูกต้องหรือไม่
ฉันถามเพราะดูเหมือนว่าคอมไพเลอร์ของฉันจะคิดอย่างนั้นแม้ว่าฉันจะไม่ทำก็ตาม echo 'int main;' | cc -x c - -Wall echo 'int main;' | c++ -x c++ - -Wall เสียงดังรบกวนไม่มีคำเตือนหรือข้อผิดพลาดเกี่ยวกับสิ่งนี้และ gcc จะออกเฉพาะคำเตือนที่อ่อนโยน: 'main' is usually a function [-Wmain]แต่เฉพาะเมื่อรวบรวมเป็น C การระบุ a -std=ดูเหมือนจะไม่สำคัญ มิฉะนั้นจะรวบรวมและเชื่อมโยงได้ดี แต่ในการดำเนินการมันจะสิ้นสุดลงทันทีด้วยSIGBUS(สำหรับฉัน) การอ่านคำตอบ (ยอดเยี่ยม) ที่สิ่งที่ main () ควรส่งคืนใน C และ C ++? และ grep อย่างรวดเร็วผ่านข้อกำหนดภาษาดูเหมือนว่าฉันจะต้องมีฟังก์ชันหลักอย่างแน่นอน แต่คำฟุ่มเฟือยจาก gcc -Wmain('main' …
113 c++  c  function  main  entry-point 

5
PATH_MAX กำหนดไว้ที่ไหนใน Linux?
ไฟล์ส่วนหัวใดที่ฉันควรเรียกใช้#includeเพื่อให้สามารถใช้ PATH_MAX เป็น int สำหรับปรับขนาดสตริงได้ ฉันต้องการที่จะประกาศ: char *current_path[PATH_MAX]; แต่เมื่อฉันทำเช่นนั้นคอมไพเลอร์ของฉัน (Clang / LLVM บน Linux) ออกข้อผิดพลาดต่อไปนี้: recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX' char *current_path[PATH_MAX]; ^ ฉันลองค้นหาโดย Google แล้ว แต่ก็ยังไม่มีโชค #include <limits.h> ไม่แก้ไขปัญหา / ข้อผิดพลาด ฉันแก้ไขด้วยหรือไม่ว่าค่าของ PATH_MAX เป็น int
113 c  linux  gcc  include  clang 


10
ฟรี (ptr) ที่ ptr เป็นหน่วยความจำ NULL เสียหายหรือไม่
ในทางทฤษฎีฉันสามารถพูดได้ว่า free(ptr); free(ptr); เป็นความเสียหายของหน่วยความจำเนื่องจากเรากำลังปลดปล่อยหน่วยความจำที่ได้รับการปลดปล่อยไปแล้ว แต่ถ้า free(ptr); ptr=NULL; free(ptr); เนื่องจากระบบปฏิบัติการจะทำงานในลักษณะที่ไม่ได้กำหนดฉันจึงไม่สามารถรับการวิเคราะห์ทางทฤษฎีที่แท้จริงเกี่ยวกับสิ่งที่เกิดขึ้นได้ ไม่ว่าฉันกำลังทำอะไรอยู่นี้หน่วยความจำเสียหายหรือไม่? การพ้นตัวชี้ NULL ถูกต้องหรือไม่?

9
เหตุใดจึงส่งคืนค่าที่ไม่ได้ใช้ให้เป็นโมฆะ
int fn(); void whatever() { (void) fn(); } มีเหตุผลใดที่ทำให้ค่าตอบแทนที่ไม่ได้ใช้กลายเป็นโมฆะหรือฉันคิดถูกแล้วที่คิดว่ามันเสียเวลาไปเปล่า ๆ ? ติดตาม: ดูเหมือนว่าจะค่อนข้างครอบคลุม ฉันคิดว่าดีกว่าการแสดงความคิดเห็นเกี่ยวกับค่าส่งคืนที่ไม่ได้ใช้เนื่องจากรหัสการจัดทำเอกสารด้วยตนเองดีกว่าความคิดเห็น โดยส่วนตัวฉันจะปิดคำเตือนเหล่านี้เนื่องจากเป็นเสียงที่ไม่จำเป็น ฉันจะกินคำพูดของฉันถ้าแมลงหนีเพราะมัน ...
112 c++  c  void 

3
เหตุใดโค้ดนี้จึง segfault บนสถาปัตยกรรม 64 บิต แต่ทำงานได้ดีบน 32 บิต
ฉันเจอปริศนา C ต่อไปนี้: ถาม: เหตุใดโปรแกรมต่อไปนี้จึง segfault บน IA-64 แต่ทำงานได้ดีบน IA-32 int main() { int* p; p = (int*)malloc(sizeof(int)); *p = 10; return 0; } ฉันรู้ว่าขนาดของintบนเครื่อง 64 บิตอาจไม่เหมือนกับขนาดของตัวชี้ ( intอาจเป็น 32 บิตและตัวชี้อาจเป็น 64 บิต) แต่ฉันไม่แน่ใจว่าสิ่งนี้เกี่ยวข้องกับโปรแกรมข้างต้นอย่างไร ความคิดใด ๆ ?

19
#ifdef vs #if - วิธีใดดีกว่า / ปลอดภัยกว่าสำหรับวิธีการเปิด / ปิดการรวบรวมโค้ดบางส่วน
นี่อาจเป็นเรื่องของรูปแบบ แต่มีความแตกแยกเล็กน้อยในทีม dev ของเราและฉันสงสัยว่ามีใครมีความคิดเกี่ยวกับเรื่องนี้บ้าง ... โดยทั่วไปเรามีคำสั่งพิมพ์ดีบักซึ่งเราปิดในระหว่างการพัฒนาตามปกติ โดยส่วนตัวแล้วฉันชอบทำสิ่งต่อไปนี้: //---- SomeSourceFile.cpp ---- #define DEBUG_ENABLED (0) ... SomeFunction() { int someVariable = 5; #if(DEBUG_ENABLED) printf("Debugging: someVariable == %d", someVariable); #endif } บางทีมชอบสิ่งต่อไปนี้: // #define DEBUG_ENABLED ... SomeFunction() { int someVariable = 5; #ifdef DEBUG_ENABLED printf("Debugging: someVariable == %d", someVariable); #endif } ... วิธีใดที่เหมาะกับคุณมากกว่าและเพราะเหตุใด …



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