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

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

2
unix โดเมนซ็อกเก็ต VS ชื่อไปป์?
หลังจากดูซ็อกเก็ตชื่อ unix และฉันคิดว่าพวกเขาชื่อไปป์ ฉันมองไปที่ท่อชื่อและไม่เห็นความแตกต่างมากนัก ฉันเห็นว่ามันเริ่มต้นแตกต่างกัน แต่นั่นเป็นสิ่งเดียวที่ฉันสังเกตเห็น ทั้งสองใช้ฟังก์ชันเขียน / อ่าน C และทำงานเหมือนกัน AFAIK อะไรคือความแตกต่างระหว่างซ็อกเก็ตโดเมน unix และท่อที่มีชื่อ? เมื่อไหร่ที่ฉันจะเลือกอันอื่น? ฉันควรใช้ข้อใดเป็นค่าเริ่มต้น (เช่นฉันใช้เวกเตอร์โดยค่าเริ่มต้นใน C ++ มากกว่าใช้ deque รายการหรือสิ่งอื่นใดหากฉันต้องการ)
122 c  linux 

3
การใช้ if (0) เพื่อข้ามเคสในสวิตช์ควรจะใช้งานได้หรือไม่?
ฉันมีสถานการณ์ที่ฉันต้องการสองกรณีในคำสั่งสลับ C ++ ให้ทั้งสองตกไปอยู่ในกรณีที่สาม โดยเฉพาะกรณีที่สองจะตกไปสู่กรณีที่สามและกรณีแรกก็จะตกไปสู่กรณีที่สามโดยไม่ผ่านกรณีที่สอง ฉันมีความคิดโง่ ๆ ลองทำดูและได้ผล! ฉันห่อกรณีที่สองใน...if (0) { }ดูเหมือนว่า: #ifdef __cplusplus # include <cstdio> #else # include <stdio.h> #endif int main(void) { for (int i = 0; i < 3; i++) { printf("%d: ", i); switch (i) { case 0: putchar('a'); // @fallthrough@ if (0) { // …

8
การเรียกซ้ำหางทำงานอย่างไร?
ฉันเกือบจะเข้าใจว่าการเรียกซ้ำหางทำงานอย่างไรและความแตกต่างระหว่างการเรียกซ้ำแบบปกติ ฉันเพียง แต่ไม่เข้าใจว่าทำไมมันไม่จำเป็นต้องมีสแต็คที่ต้องจำอยู่กลับ // tail recursion int fac_times (int n, int acc) { if (n == 0) return acc; else return fac_times(n - 1, acc * n); } int factorial (int n) { return fac_times (n, 1); } // normal recursion int factorial (int n) { if (n == 0) …

13
การค้นหารายการที่ซ้ำกันในเวลา O (n) และช่องว่าง O (1)
อินพุต: กำหนดอาร์เรย์ขององค์ประกอบ n ซึ่งมีองค์ประกอบตั้งแต่ 0 ถึง n-1 โดยตัวเลขเหล่านี้จะปรากฏกี่ครั้งก็ได้ เป้าหมาย: เพื่อค้นหาตัวเลขที่เกิดซ้ำเหล่านี้ใน O (n) และใช้พื้นที่หน่วยความจำคงที่เท่านั้น ตัวอย่างเช่นให้ n เป็น 7 และอาร์เรย์เป็น {1, 2, 3, 1, 3, 0, 6} คำตอบควรเป็น 1 & 3 ฉันตรวจสอบคำถามที่คล้ายกันที่นี่ แต่คำตอบใช้โครงสร้างข้อมูลบางอย่างเช่น HashSetฯลฯ อัลกอริทึมที่มีประสิทธิภาพเหมือนกันหรือไม่?
121 c++  c  algorithm 

23
มีอะไรอยู่ในเครื่องมือทางการศึกษาเพื่อแสดงให้เห็นถึงสมมติฐานที่ไม่มีเหตุผลที่ผู้คนตั้งไว้ใน C / C ++
ฉันต้องการเตรียมเครื่องมือทางการศึกษาเล็ก ๆ น้อย ๆ สำหรับ SO ซึ่งจะช่วยให้โปรแกรมเมอร์มือใหม่ (และระดับกลาง) รับรู้และท้าทายสมมติฐานที่ไม่ได้รับการรับรองใน C, C ++ และแพลตฟอร์มของพวกเขา ตัวอย่าง: "จำนวนเต็มพันรอบ" "ทุกคนมี ASCII" "ฉันสามารถจัดเก็บตัวชี้ฟังก์ชันในความว่างเปล่า *" ฉันคิดว่าโปรแกรมทดสอบขนาดเล็กสามารถทำงานบนแพลตฟอร์มต่างๆได้ซึ่งเรียกใช้สมมติฐานที่ "เป็นไปได้" ซึ่งจากประสบการณ์ของเราใน SO มักสร้างขึ้นโดยนักพัฒนากระแสหลักที่ไม่มีประสบการณ์ / กึ่งมีประสบการณ์จำนวนมากและบันทึกวิธีที่พวกเขาทำลายบนเครื่องต่างๆ เป้าหมายของสิ่งนี้ไม่ใช่เพื่อพิสูจน์ว่า "ปลอดภัย" ที่จะทำบางสิ่ง (ซึ่งคงเป็นไปไม่ได้ที่จะทำการทดสอบจะพิสูจน์อะไรก็ได้ถ้ามันแตก) แต่แทนที่จะแสดงให้เห็นว่าแม้แต่คนที่ไม่เข้าใจที่สุดว่าการแสดงออกที่ไม่เด่นชัดที่สุด หยุดทำงานบนเครื่องอื่นหากมีพฤติกรรมที่กำหนดไว้โดยไม่ได้กำหนดหรือการนำไปใช้งาน . เพื่อให้บรรลุสิ่งนี้ฉันอยากจะถามคุณ: ความคิดนี้จะปรับปรุงได้อย่างไร? แบบทดสอบใดที่จะดีและควรมีลักษณะอย่างไร? คุณจะทำการทดสอบบนแพลตฟอร์มที่คุณสามารถทำได้และโพสต์ผลลัพธ์เพื่อที่เราจะได้ฐานข้อมูลของแพลตฟอร์มแตกต่างกันอย่างไรและเหตุใดจึงอนุญาตให้ใช้ความแตกต่างนี้ได้ นี่คือเวอร์ชันปัจจุบันสำหรับของเล่นทดสอบ: #include <stdio.h> #include <limits.h> #include <stdlib.h> #include <stddef.h> int count=0; int total=0; …

17
Malloc คืออะไร (0)?
ฉันเพิ่งเห็นรหัสนี้: artist = (char *) malloc(0); ... และฉันก็สงสัยว่าทำไมถึงทำแบบนี้?
121 c  malloc 

21
เหตุใดจึงใช้ศูนย์ที่อยู่สำหรับตัวชี้ค่าว่าง
ใน C (หรือ C ++ สำหรับเรื่องนั้น) พอยน์เตอร์มีความพิเศษหากมีค่าเป็นศูนย์: ฉันขอแนะนำให้ตั้งค่าพอยน์เตอร์เป็นศูนย์หลังจากปลดปล่อยหน่วยความจำเพราะหมายความว่าการปล่อยพอยน์เตอร์อีกครั้งจะไม่เป็นอันตราย เมื่อฉันเรียก malloc มันจะส่งคืนตัวชี้ที่มีค่าเป็นศูนย์หากไม่สามารถรับหน่วยความจำได้ ฉันใช้if (p != 0)เวลาทั้งหมดเพื่อให้แน่ใจว่าพอยน์เตอร์ที่ผ่านนั้นถูกต้อง ฯลฯ แต่เนื่องจากการกำหนดแอดเดรสหน่วยความจำเริ่มต้นที่ 0 จึงไม่ใช่ที่อยู่ที่ถูกต้องเหมือนที่อยู่อื่น ๆ ใช่หรือไม่? 0 จะใช้ในการจัดการตัวชี้ค่าว่างได้อย่างไรหากเป็นเช่นนั้น เหตุใดจำนวนลบจึงไม่เป็นค่าว่างแทน แก้ไข: คำตอบที่ดีมากมาย ฉันจะสรุปสิ่งที่พูดในคำตอบที่แสดงในขณะที่ใจของฉันตีความมันและหวังว่าชุมชนจะแก้ไขฉันหากฉันเข้าใจผิด เช่นเดียวกับสิ่งอื่น ๆ ในการเขียนโปรแกรมมันเป็นนามธรรม เพียงแค่คงไม่เกี่ยวข้องจริงๆที่จะอยู่ 0. C ++ 0x nullptrเน้นนี้โดยการเพิ่มคำหลัก มันไม่ได้เป็นนามธรรมที่อยู่ แต่เป็นค่าคงที่ที่กำหนดโดยมาตรฐาน C และคอมไพเลอร์สามารถแปลเป็นจำนวนอื่นได้ตราบเท่าที่ตรวจสอบให้แน่ใจว่าจะไม่เท่ากับที่อยู่ "จริง" และเท่ากับพอยน์เตอร์ว่างอื่น ๆ หาก 0 ไม่ใช่ คุ้มค่าที่สุดที่จะใช้สำหรับแพลตฟอร์ม ในกรณีที่ไม่ใช่สิ่งที่เป็นนามธรรมซึ่งในช่วงแรก ๆ ระบบจะใช้แอดเดรส …
121 c++  c  memory  pointers 

3
การต่อสตริงมาโคร C / C ++
#define STR1 "s" #define STR2 "1" #define STR3 STR1 ## STR2 เป็นไปได้หรือไม่ที่จะเชื่อมต่อกันโดยมี STR3 == "s1" คุณสามารถทำได้โดยส่ง args ไปยังฟังก์ชัน Macro อื่น แต่มีทางตรงไหม?
121 c++  c  c-preprocessor 

5
เหตุใด C ++ 11 จึงไม่รองรับรายการ initializer ที่กำหนดเป็น C99 [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ พิจารณา: struct Person { int height; int weight; int age; }; int main() { Person p { .age = 18 }; } รหัสด้านบนถูกต้องตามกฎหมายใน C99 แต่ไม่ถูกกฎหมายใน C ++ 11 สิ่งที่เป็น C ++ 11 เหตุผลของคณะกรรมการมาตรฐานในการยกเว้นการสนับสนุนคุณลักษณะที่มีประโยชน์เช่นนี้หรือไม่?
121 c++  c  c++11  initialization  c99 

22
ตำแหน่งของบิตที่มีนัยสำคัญน้อยที่สุดที่ตั้งค่าไว้
ฉันกำลังมองหาวิธีที่มีประสิทธิภาพในการกำหนดตำแหน่งของบิตที่มีนัยสำคัญน้อยที่สุดที่กำหนดเป็นจำนวนเต็มเช่นสำหรับ 0x0FF0 ซึ่งจะเป็น 4 การใช้งานที่ไม่สำคัญคือ: unsigned GetLowestBitPos(unsigned value) { assert(value != 0); // handled separately unsigned pos = 0; while (!(value & 1)) { value >>= 1; ++pos; } return pos; } มีความคิดอย่างไรที่จะบีบบางรอบออกจากมัน? (หมายเหตุ: คำถามนี้มีไว้สำหรับคนที่ชอบสิ่งนั้นไม่ใช่สำหรับคนที่บอกว่า xyzoptimization นั้นชั่วร้าย) [แก้ไข] ขอบคุณทุกคนสำหรับแนวคิด! ฉันได้เรียนรู้สิ่งอื่น ๆ ด้วยเช่นกัน เย็น!

6
ฉันจะพิมพ์ไปที่ stderr ใน C ได้อย่างไร?
ใน C, การพิมพ์ที่ stdout เป็นเรื่องง่ายด้วยจากprintfstdio.h อย่างไรก็ตามสามารถพิมพ์ไปยัง stderr ได้อย่างไร? เราสามารถใช้fprintfเพื่อให้บรรลุได้อย่างชัดเจน แต่ไวยากรณ์ของมันดูแปลก ๆ บางทีเราอาจใช้printfพิมพ์ลง stderr?
121 c  printf  stderr 


3
DESTDIR และ PREFIX ของ make
ฉันกำลังพยายามติดตั้งซอฟต์แวร์ไปยังไดเร็กทอรีเฉพาะ ฉันพบหลายวิธี แต่ไม่แน่ใจว่ามีความแตกต่างกันอย่างไร ./configure --prefix=*** make install DESTDIR=*** make install prefix=*** ฉันสับสนเกี่ยวกับการทำงานของทั้งสามอย่างนี้ พวกเขาบรรลุเป้าหมายเดียวกันหรือไม่?
120 c  linux  bash  makefile  configure 

2
โครงสร้างข้อมูล“ ล่วงล้ำ” หมายความว่าอย่างไร
ฉันเคยเห็นคำว่าล่วงล้ำใช้เพื่ออธิบายโครงสร้างข้อมูลเช่นรายการและสแต็ก แต่มันหมายความว่าอย่างไร คุณสามารถยกตัวอย่างรหัสของโครงสร้างข้อมูลที่ล่วงล้ำได้และแตกต่างจากโครงสร้างที่ไม่ล่วงล้ำอย่างไร นอกจากนี้เหตุใดจึงทำให้เป็นการล่วงล้ำ (หรือไม่ล่วงล้ำ) มีประโยชน์อย่างไร? มีข้อเสียอย่างไร?

6
เหตุใดจึงต้องใช้เซ็กเมนต์. bss
สิ่งที่ฉันรู้คือตัวแปรส่วนกลางและตัวแปรคงถูกเก็บไว้ใน.dataเซ็กเมนต์และข้อมูลที่ไม่ได้กำหนดค่าเริ่มต้นจะอยู่ใน.bssเซ็กเมนต์ สิ่งที่ฉันไม่เข้าใจคือเหตุใดเราจึงมีเซ็กเมนต์เฉพาะสำหรับตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้น หากตัวแปรที่ไม่ได้เริ่มต้นมีค่าที่กำหนดในขณะรันตัวแปรจะยังคงอยู่ใน.bssเซ็กเมนต์เท่านั้นหรือไม่ ในโปรแกรมต่อไปนี้ aอยู่ใน.dataกลุ่มและbอยู่ใน.bssกลุ่ม ถูกต้องหรือไม่ กรุณาแก้ไขฉันหากความเข้าใจของฉันไม่ถูกต้อง #include <stdio.h> #include <stdlib.h> int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9}; int b[20]; /* Uninitialized, so in the .bss and will not occupy space for 20 * sizeof (int) */ int main () { ; } นอกจากนี้ให้พิจารณาโปรแกรมต่อไปนี้ …

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