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

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

5
เอกสาร / บทช่วยสอน FFmpeg C API [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการเมื่อปีที่แล้ว ปรับปรุงคำถามนี้ ฉันพยายามค้นหาเอกสารเพื่อใช้ FFmpeg C API ดูเหมือนว่าจะมีเฉพาะเอกสารบรรทัดคำสั่งเท่านั้น มีเอกสาร / บทช่วยสอน / ลิงค์ที่ดีหรือไม่?
120 c  api  documentation  ffmpeg 

7
ส่งไปยัง int vs floor
มีความแตกต่างระหว่างสิ่งเหล่านี้หรือไม่: float foo1 = (int)(bar / 3.0); float foo2 = floor(bar / 3.0); ตามที่ฉันเข้าใจทั้งสองกรณีมีผลเหมือนกัน มีความแตกต่างในโค้ดที่คอมไพล์หรือไม่?
120 c++  c  floating-point 

10
สร้างตัวชี้ไปยังอาร์เรย์สองมิติ
ฉันต้องการตัวชี้ไปยังอาร์เรย์ 2 มิติแบบคงที่ วิธีนี้ทำได้อย่างไร? static uint8_t l_matrix[10][20]; void test(){ uint8_t **matrix_ptr = l_matrix; //wrong idea } ฉันได้รับข้อผิดพลาดทุกประเภทเช่น: คำเตือน: การกำหนดจากประเภทตัวชี้ที่เข้ากันไม่ได้ ค่าตัวห้อยไม่ใช่อาร์เรย์หรือตัวชี้ ข้อผิดพลาด: การใช้สมาชิกอาร์เรย์แบบยืดหยุ่นไม่ถูกต้อง
120 c  arrays  pointers 

9
ตัวชี้ C: ชี้ไปยังอาร์เรย์ที่มีขนาดคงที่
คำถามนี้ออกไปยังผู้เชี่ยวชาญด้าน C ที่นั่น: ใน C สามารถประกาศตัวชี้ได้ดังนี้: char (* p)[10]; .. ซึ่งโดยพื้นฐานแล้วระบุว่าตัวชี้นี้ชี้ไปที่อาร์เรย์ 10 ตัวอักษร สิ่งที่เรียบร้อยเกี่ยวกับการประกาศตัวชี้เช่นนี้คือคุณจะได้รับข้อผิดพลาดเวลาคอมไพล์หากคุณพยายามกำหนดตัวชี้ของอาร์เรย์ที่มีขนาดต่างกันให้กับ p นอกจากนี้ยังจะทำให้คุณมีข้อผิดพลาดเวลาคอมไพล์หากคุณพยายามกำหนดค่าของตัวชี้ถ่านให้กับ p ฉันลองใช้ gcc และดูเหมือนว่าจะใช้ได้กับ ANSI, C89 และ C99 สำหรับฉันแล้วดูเหมือนว่าการประกาศตัวชี้แบบนี้จะมีประโยชน์มากโดยเฉพาะอย่างยิ่งเมื่อส่งตัวชี้ไปยังฟังก์ชัน โดยปกติผู้คนจะเขียนต้นแบบของฟังก์ชันเช่นนี้: void foo(char * p, int plen); หากคุณคาดหวังว่าจะมีบัฟเฟอร์ที่มีขนาดเฉพาะคุณก็แค่ทดสอบค่าของ plen อย่างไรก็ตามคุณไม่สามารถรับประกันได้ว่าบุคคลที่ส่ง p ถึงคุณจะให้ตำแหน่งหน่วยความจำที่ถูกต้องในบัฟเฟอร์นั้น คุณต้องเชื่อมั่นว่าบุคคลที่เรียกว่าฟังก์ชันนี้ทำในสิ่งที่ถูกต้อง ในทางกลับกัน: void foo(char (*p)[10]); .. จะบังคับให้ผู้โทรให้บัฟเฟอร์ตามขนาดที่กำหนด ดูเหมือนว่ามีประโยชน์มาก แต่ฉันไม่เคยเห็นตัวชี้ที่ประกาศแบบนี้ในรหัสใด ๆ ที่ฉันเคยพบ คำถามของฉันคือมีเหตุผลใดบ้างที่คนไม่ประกาศคำชี้เช่นนี้? ฉันไม่เห็นข้อผิดพลาดที่ชัดเจนหรือไม่?
120 c  pointers  size 

13
พิมพ์ call stack ใน C หรือ C ++
มีวิธีใดในการถ่ายโอนข้อมูลการโทรในกระบวนการทำงานใน C หรือ C ++ ทุกครั้งที่เรียกใช้ฟังก์ชันบางอย่าง สิ่งที่ฉันคิดไว้มีดังนี้: void foo() { print_stack_trace(); // foo's body return } สถานที่print_stack_traceทำงานคล้ายกับcallerใน Perl หรือสิ่งนี้: int main (void) { // will print out debug info every time foo() is called register_stack_trace_function(foo); // etc... } ที่register_stack_trace_functionวางเบรกพอยต์ภายในบางประเภทที่จะทำให้การติดตามสแต็กถูกพิมพ์เมื่อใดก็ตามที่fooถูกเรียก สิ่งนี้มีอยู่ในไลบรารี C มาตรฐานหรือไม่? ฉันทำงานบน Linux โดยใช้ GCC พื้นหลัง ฉันมีการทดสอบที่ทำงานแตกต่างกันไปตามสวิตช์บรรทัดคำสั่งบางอย่างที่ไม่ควรส่งผลต่อพฤติกรรมนี้ รหัสของฉันมีตัวสร้างตัวเลขสุ่มหลอกที่ฉันคิดว่าถูกเรียกแตกต่างกันไปตามสวิตช์เหล่านี้ ฉันต้องการเรียกใช้การทดสอบกับสวิตช์แต่ละชุดและดูว่าตัวสร้างตัวเลขสุ่มถูกเรียกแตกต่างกันหรือไม่สำหรับแต่ละอัน
120 c++  c  linux  callstack 

1
วิธีสำนวนใน CMAKE ในการเพิ่มตัวเลือกคอมไพเลอร์ -fPIC คืออะไร?
ฉันเจออย่างน้อย 3 วิธีในการทำสิ่งนี้และฉันสงสัยว่าวิธีใดเป็นสำนวน สิ่งนี้จำเป็นต้องดำเนินการในระดับสากลกับไลบรารีแบบคงที่ ฉันแปลกใจที่ตัวสร้าง Makefile ใน CMake ไม่เพิ่มสิ่งนี้ลงในไลบรารีแบบคงที่โดยอัตโนมัติ (เว้นแต่ฉันจะพลาดอะไรไป?) target_compile_options(myLib PRIVATE -fPIC) add_compile_options(-fPIC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") ฉันเชื่อว่าอาจมีรูปแบบอื่น ๆ (โปรดแก้ไขคำถามของฉันหากคุณพบ) หากคุณทราบคำตอบสำหรับคำถามนี้คุณทราบหรือไม่ว่ามีวิธีใดที่จะทำให้โครงการ CMake ของบุคคลที่สามถูกคอมไพล์ด้วยแฟล็กนี้โดยไม่ต้องแก้ไขไฟล์ CMakeLists.txt ฉันทำงานข้ามไลบรารีแบบคงที่โดยไม่มีแฟล็กนั้น ทำให้เกิดปัญหาเมื่อรวบรวมไลบรารีแบบคงที่ลงในไลบรารีไดนามิก คุณได้รับ: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
120 c++  c  cmake 

11
Spinlock กับ Semaphore
อะไรคือความแตกต่างพื้นฐานระหว่างเซมาฟอร์และสปินล็อค? เมื่อใดที่เราจะใช้เซมาฟอร์บนสปินล็อค?
119 c++  c  linux  unix  operating-system 

27
วิธีใดที่เร็วที่สุด / มีประสิทธิภาพที่สุดในการค้นหาบิตชุดสูงสุด (msb) ในจำนวนเต็มใน C
ถ้าฉันมีจำนวนเต็ม n และฉันต้องการทราบตำแหน่งของบิตที่มีนัยสำคัญที่สุด (นั่นคือถ้าบิตที่มีนัยสำคัญน้อยที่สุดอยู่ทางขวาฉันต้องการทราบตำแหน่งของบิตทางซ้ายที่ไกลที่สุดซึ่งเป็น 1) วิธีใดที่เร็วที่สุด / มีประสิทธิภาพที่สุดในการค้นหา ฉันรู้ว่า POSIX สนับสนุนffs()วิธีการใน strings.h เพื่อค้นหาบิตชุดแรก แต่ดูเหมือนจะไม่มีfls()วิธีที่เกี่ยวข้อง มีวิธีที่ชัดเจนในการทำสิ่งนี้ที่ฉันพลาดไปหรือไม่? แล้วในกรณีที่คุณไม่สามารถใช้ฟังก์ชัน POSIX เพื่อการพกพาได้ล่ะ? แก้ไข: สิ่งที่เกี่ยวกับโซลูชันที่ใช้ได้กับสถาปัตยกรรมทั้ง 32 และ 64 บิต (รายการรหัสหลายรายการดูเหมือนว่าจะใช้ได้เฉพาะกับ 32 บิตเท่านั้น)


2
การจัดการสัญญาณที่มีหลายเธรดใน Linux
ใน Linux จะเกิดอะไรขึ้นเมื่อโปรแกรม (ซึ่งอาจมีหลายเธรด) ได้รับสัญญาณเช่น SIGTERM หรือ SIGHUP กระทู้ไหนดักฟังสัญญาณ หลายเธรดสามารถรับสัญญาณเดียวกันได้หรือไม่? มีเธรดพิเศษเฉพาะสำหรับการจัดการสัญญาณหรือไม่? ถ้าไม่เกิดอะไรขึ้นภายในเธรดที่จัดการสัญญาณ? การดำเนินการจะดำเนินต่อไปอย่างไรหลังจากรูทีนตัวจัดการสัญญาณเสร็จสิ้น
119 c  linux  multithreading  signals  ipc 


4
dot (.) หมายถึงอะไรในตัวเริ่มต้นโครงสร้าง
static struct fuse_oprations hello_oper = { .getattr = hello_getattr, .readdir = hello_readdir, .open = hello_open, .read = hello_read, }; ฉันไม่เข้าใจไวยากรณ์ C นี้ดี ฉันค้นหาไม่ได้ด้วยซ้ำเพราะฉันไม่รู้ชื่อไวยากรณ์ นั่นอะไร?

6
การเริ่มต้นอาร์เรย์ถ่าน C
ฉันไม่แน่ใจว่าจะมีอะไรอยู่ในอาร์เรย์ถ่านหลังจากเริ่มต้นด้วยวิธีต่อไปนี้ 1. char buf[10] = ""; 2. char buf[10] = " "; 3.char buf[10] = "a"; สำหรับกรณีที่ 2 ผมคิดว่าbuf[0]ควรจะ' ', buf[1]ควรจะเป็น'\0'และจากbuf[2]ไปbuf[9]จะเป็นเนื้อหาที่สุ่ม สำหรับกรณีที่ 3 ผมคิดว่าbuf[0]ควรจะ'a', buf[1]ควรจะ '\ 0' และจากbuf[2]ไปbuf[9]จะเป็นเนื้อหาที่สุ่ม ถูกต้องหรือไม่ และสำหรับกรณีที่ 1 จะเป็นbufอย่างไรใน? buf[0] == '\0'และจากbuf[1]ถึงbuf[9]จะเป็นเนื้อหาแบบสุ่ม?

6
ตรวจสอบว่า stdin เป็นขั้วหรือท่อ?
เมื่อฉันรัน " python" จากเทอร์มินัลโดยไม่มีข้อโต้แย้งมันจะแสดงเชลล์โต้ตอบของ Python เมื่อฉันรัน " cat | python" จากเทอร์มินัลมันจะไม่เปิดโหมดโต้ตอบ อย่างไรก็ตามโดยไม่ได้รับอินพุตใด ๆ ก็ตรวจพบว่าเชื่อมต่อกับท่อ ฉันจะตรวจจับที่คล้ายกันใน C หรือ C ++ หรือ Qt ได้อย่างไร
118 c++  c  qt  pipe  stdin 

9
ความจำรั่วไหลไปได้ไกลแค่ไหน?
ฉันเจอปัญหาหน่วยความจำรั่วหลายครั้ง โดยปกติเมื่อฉันรู้สึกmallocเหมือนไม่มีวันพรุ่งนี้หรือห้อยโหนFILE *เหมือนซักผ้าสกปรก โดยทั่วไปฉันถือว่า (อ่าน: หวังเป็นอย่างยิ่ง) ว่าหน่วยความจำทั้งหมดจะถูกล้างอย่างน้อยที่สุดเมื่อโปรแกรมสิ้นสุดลง มีสถานการณ์ใดบ้างที่จะไม่รวบรวมหน่วยความจำที่รั่วไหลเมื่อโปรแกรมหยุดทำงานหรือล่ม? หากคำตอบแตกต่างกันอย่างมากในแต่ละภาษาให้เน้นที่ C (++) โปรดสังเกตการใช้วลีที่เกินความจริงเช่น 'เหมือนไม่มีวันพรุ่งนี้' และ 'ห้อย ... เหมือนซักผ้าสกปรก' ความไม่ปลอดภัย * malloc* อาจทำร้ายคนที่คุณรักได้ นอกจากนี้โปรดใช้ความระมัดระวังในการซักผ้าที่สกปรก
118 c++  c  memory  memory-leaks 

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