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

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

8
วิธีติดตามข้อผิดพลาด "ฟรีหรือเสียหายสองเท่า"
เมื่อฉันเรียกใช้โปรแกรม (C ++) ของฉันมันขัดข้องด้วยข้อผิดพลาดนี้ * ตรวจพบ glibc * ./load: ฟรีสองเท่าหรือเสียหาย (! prev): 0x0000000000c6ed50 *** ฉันจะติดตามข้อผิดพลาดได้อย่างไร ฉันลองใช้std::coutคำสั่งprint ( ) แต่ไม่ประสบความสำเร็จ สามารถgdbทำให้ง่ายขึ้น?
94 c++  c  debugging  free 

10
ฉันจะสร้าง "ตัวเว้นวรรค" ในโครงสร้างหน่วยความจำคลาส C ++ ได้อย่างไร
ปัญหา ในบริบทฝังโลหะเปลือยระดับต่ำฉันต้องการสร้างพื้นที่ว่างในหน่วยความจำภายในโครงสร้าง C ++ และไม่มีชื่อใด ๆ เพื่อห้ามไม่ให้ผู้ใช้เข้าถึงตำแหน่งหน่วยความจำดังกล่าว ตอนนี้ฉันทำได้สำเร็จแล้วโดยการใส่uint32_t :96;บิตฟิลด์ที่น่าเกลียดซึ่งจะแทนที่สามคำได้อย่างสะดวก แต่มันจะขึ้นคำเตือนจาก GCC (Bitfield ใหญ่เกินไปที่จะใส่ใน uint32_t) ซึ่งค่อนข้างถูกต้อง แม้ว่าจะใช้งานได้ดี แต่ก็ไม่ค่อยสะอาดนักเมื่อคุณต้องการแจกจ่ายห้องสมุดที่มีคำเตือนหลายร้อยคำ ... ฉันจะทำอย่างถูกต้องได้อย่างไร? เหตุใดจึงมีปัญหาตั้งแต่แรก โครงการที่ฉันกำลังดำเนินการประกอบด้วยการกำหนดโครงสร้างหน่วยความจำของอุปกรณ์ต่อพ่วงต่างๆของสายไมโครคอนโทรลเลอร์ทั้งหมด (STMicroelectronics STM32) ในการทำเช่นนั้นผลลัพธ์คือคลาสที่มีการรวมกันของโครงสร้างต่างๆซึ่งกำหนดการลงทะเบียนทั้งหมดขึ้นอยู่กับไมโครคอนโทรลเลอร์เป้าหมาย ตัวอย่างง่ายๆสำหรับอุปกรณ์ต่อพ่วงที่เรียบง่ายมีดังต่อไปนี้: อินพุต / เอาท์พุตวัตถุประสงค์ทั่วไป (GPIO) union { struct { GPIO_MAP0_MODER; GPIO_MAP0_OTYPER; GPIO_MAP0_OSPEEDR; GPIO_MAP0_PUPDR; GPIO_MAP0_IDR; GPIO_MAP0_ODR; GPIO_MAP0_BSRR; GPIO_MAP0_LCKR; GPIO_MAP0_AFR; GPIO_MAP0_BRR; GPIO_MAP0_ASCR; }; struct { GPIO_MAP1_CRL; GPIO_MAP1_CRH; GPIO_MAP1_IDR; …

6
เมื่อใดที่ฉันควรใช้ malloc ใน C และเมื่อใดที่ไม่ควรใช้
ฉันเข้าใจวิธีการทำงานของ malloc () คำถามของฉันคือฉันจะเห็นสิ่งนี้: #define A_MEGABYTE (1024 * 1024) char *some_memory; size_t size_to_allocate = A_MEGABYTE; some_memory = (char *)malloc(size_to_allocate); sprintf(some_memory, "Hello World"); printf("%s\n", some_memory); free(some_memory); ฉันละเว้นการตรวจสอบข้อผิดพลาดเพื่อความกะทัดรัด คำถามของฉันคือคุณไม่สามารถดำเนินการข้างต้นโดยการเริ่มต้นตัวชี้ไปยังที่จัดเก็บแบบคงที่ในหน่วยความจำได้หรือไม่? บางที: char *some_memory = "Hello World"; ณ จุดใดที่คุณต้องจัดสรรหน่วยความจำด้วยตัวคุณเองแทนที่จะประกาศ / เริ่มต้นค่าที่คุณต้องเก็บไว้

3
วิธีตั้งค่าเบรกพอยต์บนไลบรารีที่แชร์ในอนาคตด้วยแฟล็กคำสั่ง
ฉันกำลังพยายามทำให้เซสชัน gdb อัตโนมัติโดยใช้--commandแฟล็ก ฉันกำลังพยายามตั้งค่าเบรกพอยต์สำหรับฟังก์ชันในไลบรารีที่ใช้ร่วมกัน (เทียบเท่ากับ Unix ของ DLL) cmds.gdb ของฉันมีลักษณะดังนี้: set args /home/shlomi/conf/bugs/kde/font-break.txt b IA__FcFontMatch r อย่างไรก็ตามฉันได้รับสิ่งต่อไปนี้: shlomi: ~ / progs / bugs-external / kde / font-ทำลาย $ gdb --command = cmds.gdb ... GNU gdb 6.8-2mdv2009.0 (Mandriva Linux รีลีส 2009.0) ลิขสิทธิ์ (C) 2008 Free Software Foundation, Inc. ใบอนุญาต GPLv3 +: …
94 c++  c  linux  unix  gdb 

7
แมปอาร์เรย์ 2D เข้ากับอาร์เรย์ 1D
ฉันต้องการแสดงอาร์เรย์ 2 มิติด้วยอาร์เรย์ 1D ฟังก์ชันจะส่งผ่านสองตัวบ่งชี้ (x, y) และค่าที่จะจัดเก็บ ตัวบ่งชี้ทั้งสองนี้จะแสดงถึงองค์ประกอบเดียวของอาร์เรย์ 1D และตั้งค่าตามนั้น ฉันรู้ว่าอาร์เรย์ 1D ต้องมีขนาดของ arrayWidth × arrayHeight แต่ฉันไม่รู้วิธีตั้งค่าแต่ละองค์ประกอบ ตัวอย่างเช่นฉันจะแยกแยะ (2,4,3) จาก (4,2,3) ได้อย่างไร ฉันลองตั้งค่าอาร์เรย์เป็น x * y แต่ 2 * 4 และ 4 * 2 จะทำให้เกิดจุดเดียวกันในอาร์เรย์และฉันต้องการให้มันต่างกัน



3
มีเครื่องจักรที่ sizeof (ถ่าน)! = 1 หรืออย่างน้อย CHAR_BIT> 8 หรือไม่
Наэтотвопросестьответына Stack Overflow нарусском : Кто-нибудьвстречалвсвоейпрактике sizeof (ถ่าน)! = 1? มีเครื่องจักร (หรือคอมไพเลอร์) อยู่ที่ไหนsizeof(char) != 1? ไม่มาตรฐาน C99กล่าวว่าsizeof(char)ในการดำเนินการปฏิบัติตามมาตรฐานต้องเป็น 1? ถ้าเป็นเช่นนั้นโปรดให้หมายเลขมาตราและการอ้างอิง อัปเดต: หากฉันมีเครื่อง (CPU) ซึ่งไม่สามารถระบุไบต์ได้ (อ่านน้อยที่สุดคือ 4 ไบต์จัดแนว) แต่มีไบต์เพียง 4 วินาที ( uint32_t) คอมไพเลอร์สำหรับเครื่องนี้สามารถกำหนดsizeof(char)เป็น 4 ได้หรือไม่ sizeof(char)จะเป็น 1 แต่ถ่านจะมี 32 บิต ( CHAR_BITมาโคร) Update2: แต่ขนาดของผลลัพธ์ไม่ใช่ไบต์! มีขนาดเท่ากับ CHAR และถ่านสามารถเป็น 2 ไบต์หรือ (อาจเป็น) 7 …
93 c  char  standards  sizeof  c99 

3
การพิมพ์พอยน์เตอร์ว่างด้วย% p เป็นพฤติกรรมที่ไม่ได้กำหนด?
เป็นพฤติกรรมที่ไม่ได้กำหนดไว้ในการพิมพ์พอยน์เตอร์ว่างด้วยตัว%pระบุการแปลงหรือไม่ #include <stdio.h> int main(void) { void *p = NULL; printf("%p", p); return 0; } คำถามนี้ใช้กับมาตรฐาน C ไม่ใช่กับการใช้งาน C

13
แปลง endian ตัวใหญ่เป็น endian ตัวเล็กใน C [โดยไม่ต้องใช้ func ที่ให้มา] [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน7 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันต้องเขียนฟังก์ชันเพื่อแปลง endian ตัวใหญ่เป็น endian ตัวเล็กใน C. ฉันไม่สามารถใช้ฟังก์ชันไลบรารีใด ๆ
93 c  swap  endianness 

10
ค่าเริ่มต้นในโครงสร้าง C
ฉันมีโครงสร้างข้อมูลดังนี้: Struct foo { รหัส int; เส้นทาง int; int backup_route; int current_route; } และฟังก์ชั่นที่เรียกว่า update () ที่ใช้เพื่อร้องขอการเปลี่ยนแปลง อัปเดต (42, dont_care, dont_care, new_route); นี่มันยาวมากและถ้าฉันเพิ่มบางอย่างลงในโครงสร้างฉันต้องเพิ่ม 'dont_care' ในทุก ๆ การเรียกเพื่ออัปเดต (... ) ฉันกำลังคิดที่จะส่ง Struct แทน แต่การกรอก struct ด้วย 'dont_care' ไว้ล่วงหน้านั้นน่าเบื่อยิ่งกว่าการสะกดคำในการเรียกฟังก์ชัน ฉันสามารถสร้างโครงสร้างที่ใดที่หนึ่งด้วยค่าเริ่มต้นของการไม่สนใจและตั้งค่าฟิลด์ที่ฉันสนใจหลังจากที่ฉันประกาศเป็นตัวแปรภายใน โครงสร้าง foo = {.id = 42, .current_route = new_route}; อัปเดต (& bar); …
93 c  initialization 

10
วิธีการทำให้เกิดการถ่ายโอนข้อมูลหลักใน C / C ++ โดยทางโปรแกรม
ฉันต้องการบังคับให้ดัมพ์หลักที่ตำแหน่งเฉพาะในแอปพลิเคชัน C ++ ของฉัน ฉันรู้ว่าฉันทำได้โดยทำสิ่งที่ชอบ: int * crash = NULL; *crash = 1; แต่อยากทราบว่ามีวิธีที่สะอาดกว่านี้ไหม? ฉันกำลังใช้ Linux อยู่
93 c++  c  linux  coredump  abort 

7
ทำไมต้องกำหนดมาโครถ้ายังไม่ได้กำหนดไว้
ในฐานรหัส C ของเราฉันเห็นทุกมาโครที่กำหนดด้วยวิธีต่อไปนี้: #ifndef BEEPTRIM_PITCH_RATE_DEGPS #define BEEPTRIM_PITCH_RATE_DEGPS 0.2f #endif #ifndef BEEPTRIM_ROLL_RATE_DEGPS #define BEEPTRIM_ROLL_RATE_DEGPS 0.2f #endif #ifndef FORCETRIMRELEASE_HOLD_TIME_MS #define FORCETRIMRELEASE_HOLD_TIME_MS 1000.0f #endif #ifndef TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS #define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS 50.0f #endif อะไรคือเหตุผลของการทำการตรวจสอบกำหนดเหล่านี้แทนที่จะเพียงแค่กำหนดมาโคร #define BEEPTRIM_PITCH_RATE_DEGPS 0.2f #define BEEPTRIM_ROLL_RATE_DEGPS 0.2f #define FORCETRIMRELEASE_HOLD_TIME_MS 1000.0f #define TRIMSYSTEM_SHEARPIN_BREAKINGFORCE_LBS 50.0f ฉันไม่พบวิธีปฏิบัตินี้ที่อธิบายไว้ในเว็บ

2
ผลลัพธ์ของ + = ใน C และ C ++ คืออะไร?
ฉันมีรหัสต่อไปนี้: #include <stdio.h> int main(int argc, char **argv) { int i = 0; (i+=10)+=10; printf("i = %d\n", i); return 0; } หากฉันพยายามรวบรวมเป็นแหล่ง C โดยใช้ gcc ฉันได้รับข้อผิดพลาด: error: lvalue required as left operand of assignment แต่ถ้าฉันรวบรวมเป็นซอร์ส C ++ โดยใช้ g ++ ฉันไม่ได้รับข้อผิดพลาดและเมื่อฉันเรียกใช้ไฟล์ปฏิบัติการ: i = 20 ทำไมพฤติกรรมต่างกัน?
93 c++  c 

6
extern inline ทำอะไร?
ฉันเข้าใจว่าinlineโดยตัวมันเองเป็นข้อเสนอแนะของคอมไพเลอร์และตามดุลยพินิจของมันอาจหรือไม่อาจอินไลน์ฟังก์ชันและมันจะสร้างรหัสออบเจ็กต์ที่เชื่อมโยงได้ด้วย ฉันคิดว่าstatic inlineมันเหมือนกัน (อาจหรืออาจไม่อินไลน์ก็ได้) แต่จะไม่สร้างโค้ดออบเจ็กต์ที่เชื่อมโยงได้เมื่ออินไลน์ (เนื่องจากไม่มีโมดูลอื่นที่สามารถเชื่อมโยงไปได้) สถานที่ที่ไม่extern inlineเหมาะสมลงในภาพหรือไม่ สมมติว่าฉันต้องการแทนที่มาโครตัวประมวลผลล่วงหน้าด้วยฟังก์ชันอินไลน์และต้องการให้ฟังก์ชันนี้อินไลน์ (เช่นเนื่องจากใช้มาโคร__FILE__และ__LINE__มาโครที่ควรแก้ไขสำหรับผู้เรียก แต่ไม่ใช่ฟังก์ชันที่เรียกว่านี้) นั่นคือฉันต้องการเห็นข้อผิดพลาดของคอมไพเลอร์หรือตัวเชื่อมโยงในกรณีที่ฟังก์ชันไม่ได้รับการอินไลน์ ไม่extern inlineทำเช่นนี้? (ฉันคิดว่าถ้าไม่เป็นเช่นนั้นจะไม่มีวิธีใดที่จะบรรลุพฤติกรรมนี้นอกจากการยึดติดกับมาโคร) มีความแตกต่างระหว่าง C ++ และ C หรือไม่? มีความแตกต่างระหว่างผู้จำหน่ายคอมไพเลอร์และเวอร์ชันต่างๆหรือไม่?

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