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

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

8
ความแตกต่างระหว่าง fprintf, printf และ sprintf หรือไม่
ทุกคนสามารถอธิบายในภาษาอังกฤษง่าย ๆ เกี่ยวกับความแตกต่างระหว่างprintf, fprintfและsprintfมีตัวอย่าง? กระแสข้อมูลคืออะไร ฉันสับสนระหว่างสามสิ่งนี้ในขณะที่อ่านเกี่ยวกับ "การจัดการไฟล์ใน C"
233 c  io  stream  printf 

8
uint8_t กับถ่านที่ไม่ได้ลงชื่อ
อะไรคือข้อได้เปรียบของการใช้uint8_tเกินunsigned charใน C? ฉันรู้ว่าในเกือบทุกระบบuint8_tเป็นเพียง typedef unsigned charแล้วทำไมต้องใช้มันล่ะ
231 c  typedef 

30
หน่วยความจำรั่วไหลตกลงไหม [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ เป็นที่ยอมรับหรือไม่ว่ามีหน่วยความจำรั่วในแอพพลิเคชั่น C หรือ C ++ ของคุณ? จะเกิดอะไรขึ้นถ้าคุณจัดสรรหน่วยความจำบางส่วนและใช้จนถึงรหัสบรรทัดสุดท้ายในแอปพลิเคชันของคุณ (ตัวอย่างเช่น destructor ของวัตถุระดับโลก) ตราบใดที่ปริมาณการใช้หน่วยความจำไม่เพิ่มขึ้นเรื่อย ๆ มันก็โอเคที่จะไว้ใจระบบปฏิบัติการให้เพิ่มหน่วยความจำให้คุณหรือเปล่าเมื่อแอปพลิเคชันของคุณถูกยกเลิก (ใน Windows, Mac และ Linux)? คุณจะพิจารณาเรื่องนี้ว่าหน่วยความจำจริงรั่วไหลหรือไม่หากหน่วยความจำนั้นถูกใช้อย่างต่อเนื่องจนกว่า OS จะเป็นอิสระ ถ้าห้องสมุดบุคคลที่สามบังคับให้คุณทำเช่นนี้ล่ะ จะปฏิเสธที่จะใช้ห้องสมุดบุคคลที่สามไม่ว่ามันจะดีแค่ไหน ฉันเห็นข้อเสียเพียงข้อเดียวในทางปฏิบัติและนั่นก็คือการรั่วไหลที่ไม่เป็นอันตรายเหล่านี้จะปรากฏขึ้นพร้อมกับเครื่องมือตรวจจับการรั่วไหลของหน่วยความจำว่าเป็นผลบวกปลอม
231 c++  c  memory-leaks 

11
ทำไมฟังก์ชั่นที่ได้รับมีอันตรายมากจนไม่ควรใช้?
เมื่อฉันพยายามรวบรวมรหัส C ที่ใช้gets()ฟังก์ชันกับ GCC ฉันได้รับคำเตือนนี้: (.text + 0x34): คำเตือน: ฟังก์ชั่น `รับ 'เป็นอันตรายและไม่ควรใช้ ฉันจำได้ว่าสิ่งนี้เกี่ยวข้องกับการป้องกันและความปลอดภัยของกองซ้อน แต่ฉันไม่แน่ใจว่าทำไม ฉันจะลบคำเตือนนี้ได้อย่างไรและทำไมจึงมีคำเตือนเกี่ยวกับการใช้ gets() ? หากgets()อันตรายดังนั้นทำไมเราไม่สามารถลบได้
229 c  fgets  buffer-overflow  gets 

5
เหตุใด GCC จึงใช้การคูณด้วยจำนวนแปลก ๆ ในการใช้การหารจำนวนเต็ม
ฉันได้อ่านเกี่ยวกับการประกอบdivและการmulประกอบและฉันตัดสินใจที่จะเห็นพวกเขาในการดำเนินการโดยการเขียนโปรแกรมง่าย ๆ ใน C: ไฟล์ Division.c #include <stdlib.h> #include <stdio.h> int main() { size_t i = 9; size_t j = i / 5; printf("%zu\n",j); return 0; } จากนั้นสร้างรหัสภาษาแอสเซมบลีด้วย: gcc -S division.c -O0 -masm=intel แต่การดูdivision.sไฟล์ที่สร้างขึ้นมันไม่มีการดำเนินการใด ๆ ของ div! แต่กลับกลายเป็นเวทมนตร์ดำบางชนิดที่มีการเปลี่ยนบิตและตัวเลขเวทย์มนตร์ นี่คือข้อมูลโค้ดที่คำนวณi/5: mov rax, QWORD PTR [rbp-16] ; Move i (=9) to RAX …



8
ตัวชี้ฐานและตัวชี้สแต็คคืออะไร? พวกเขาทำในสิ่งที่ชี้?
การใช้ตัวอย่างนี้มาจากวิกิพีเดียซึ่ง DrawSquare () เรียก DrawLine () (โปรดทราบว่าแผนภาพนี้มีที่อยู่สูงที่ด้านล่างและที่อยู่ต่ำที่ด้านบน) ใครสามารถอธิบายฉันว่าอะไรebpและespอยู่ในบริบทนี้บ้าง จากสิ่งที่ฉันเห็นฉันจะบอกว่าตัวชี้สแต็คชี้ไปที่ด้านบนสุดของสแต็กเสมอและตัวชี้พื้นฐานไปยังจุดเริ่มต้นของฟังก์ชันปัจจุบันหรือไม่ หรืออะไร? แก้ไข: ฉันหมายถึงสิ่งนี้ในบริบทของโปรแกรม windows edit2: และมันeipทำงานอย่างไรเช่นกัน? edit3:ฉันมีรหัสต่อไปนี้จาก MSVC ++: var_C= dword ptr -0Ch var_8= dword ptr -8 var_4= dword ptr -4 hInstance= dword ptr 8 hPrevInstance= dword ptr 0Ch lpCmdLine= dword ptr 10h nShowCmd= dword ptr 14h พวกเขาทั้งหมดดูเหมือนจะเป็น dwords ดังนั้นจึงใช้เวลา 4 …
225 c++  c  assembly  x86 

10
การเข้าถึงอาร์เรย์นั้นมีอันตรายแค่ไหน
การเข้าถึงอาเรย์นั้นมีอันตรายเพียงใดนอกขอบเขต (ใน C)? บางครั้งมันอาจเกิดขึ้นที่ฉันอ่านจากนอกอาร์เรย์ (ตอนนี้ฉันเข้าใจแล้วฉันเข้าถึงหน่วยความจำที่ใช้โดยส่วนอื่น ๆ ของโปรแกรมของฉันหรือมากกว่านั้น) หรือฉันพยายามตั้งค่าเป็นดัชนีนอกอาร์เรย์ บางครั้งโปรแกรมขัดข้อง แต่บางครั้งก็ทำงานเพียงให้ผลลัพธ์ที่ไม่คาดคิด ทีนี้สิ่งที่ฉันอยากรู้ก็คือมันอันตรายแค่ไหน? ถ้ามันทำให้โปรแกรมของฉันเสียหายก็ไม่เลว หากในอีกทางหนึ่งมันแตกบางอย่างนอกโปรแกรมของฉันเพราะฉันสามารถเข้าถึงหน่วยความจำที่ไม่เกี่ยวข้องทั้งหมดได้ฉันคิดว่า ฉันอ่าน 'สิ่งที่สามารถเกิดขึ้นได้' มากมาย'การแบ่งส่วนอาจเป็นปัญหาที่น้อยที่สุด' 'ฮาร์ดดิสก์ของคุณอาจเปลี่ยนเป็นสีชมพูและยูนิคอร์นอาจร้องเพลงใต้หน้าต่างของคุณ' ซึ่งเป็นสิ่งที่ดี แต่สิ่งที่เป็นอันตรายจริงๆ? คำถามของฉัน: การอ่านค่าจากด้านนอกอาเรย์จะทำให้เกิดความเสียหายอะไรนอกเหนือจากโปรแกรมของฉันหรือไม่? ฉันคิดว่าการดูสิ่งต่าง ๆ จะไม่เปลี่ยนแปลงอะไรเลยหรืออย่างเช่นจะเปลี่ยนแอตทริบิวต์ 'เปิดครั้งล่าสุด' ของไฟล์ที่ฉันไปให้ถึง การตั้งค่าต่าง ๆ นอกอาร์เรย์สามารถทำให้เกิดความเสียหายอะไรนอกเหนือจากโปรแกรมของฉันได้หรือไม่? จาก คำถาม Stack Overflowฉันรวบรวมว่าเป็นไปได้ที่จะเข้าถึงตำแหน่งหน่วยความจำใด ๆ ที่ไม่มีการรับประกันความปลอดภัย ตอนนี้ฉันรันโปรแกรมเล็ก ๆ ของฉันจากภายใน XCode นั่นให้การป้องกันพิเศษรอบ ๆ โปรแกรมของฉันซึ่งมันไม่สามารถเข้าถึงภายนอกหน่วยความจำของตัวเองได้หรือไม่? มันจะเป็นอันตรายต่อ XCode หรือไม่? คำแนะนำใด ๆ เกี่ยวกับวิธีเรียกใช้โค้ด buggy ของฉันอย่างปลอดภัยหรือไม่ …
221 c  arrays  memory 


5
ความแตกต่างระหว่าง __PRETTY_FUNCTION__, __FUNCTION__, __func__ คืออะไร
อะไรคือความแตกต่างระหว่าง__PRETTY_FUNCTION__, __FUNCTION__, __func__และสถานที่ที่พวกเขาจะได้รับการบันทึก? ฉันจะตัดสินใจได้อย่างไรว่าควรใช้อันไหน

9
ฉันจำเป็นต้องจัดการกับจำนวนลบหรือศูนย์อย่างชัดเจนหรือไม่เมื่อรวมผลรวมของตัวเลขยกกำลังสอง?
ฉันเพิ่งผ่านการทดสอบในชั้นเรียนของฉัน หนึ่งในปัญหาคือต่อไปนี้: รับจำนวนnเขียนฟังก์ชั่นใน C / C ++ ที่ส่งกลับผลรวมของตัวเลขของจำนวนที่ยกกำลังสอง (ต่อไปนี้เป็นสิ่งสำคัญ) ช่วงของnเป็น [- (10 ^ 7), 10 ^ 7] ตัวอย่าง: ถ้าn = 123 ฟังก์ชันของคุณควรกลับ 14 (1 ^ 2 + 2 ^ 2 + 3 ^ 2 = 14) นี่คือฟังก์ชั่นที่ฉันเขียน: int sum_of_digits_squared(int n) { int s = 0, c; while (n) { c …
220 c 

9
วิธีปิดการใช้งานคำเตือนของ GCC สำหรับรหัสสองสามบรรทัด
ใน Visual C ++ #pragma warning (disable: ...)มันเป็นไปได้ที่จะใช้งาน นอกจากนี้ผมพบว่าใน GCC คุณสามารถแทนที่ต่อธงคอมไพเลอร์ไฟล์ ฉันจะทำสิ่งนี้สำหรับ "บรรทัดถัดไป" หรือด้วยความหมายของพุช / ป๊อปรอบ ๆ พื้นที่ของรหัสโดยใช้ GCC ได้อย่างไร

11
C fopen เทียบกับเปิด
มีเหตุผลใดบ้าง (นอกเหนือจากวากยสัมพันธ์) ที่คุณต้องการใช้ FILE *fdopen(int fd, const char *mode); หรือ FILE *fopen(const char *path, const char *mode); แทน int open(const char *pathname, int flags, mode_t mode); เมื่อใช้ C ในสภาพแวดล้อม Linux?
219 c  linux  unix  file-io  fopen 

8
ข้อแตกต่างระหว่างอาร์เรย์และตัวชี้ถ่านใน C คืออะไร?
ฉันพยายามทำความเข้าใจพอยน์เตอร์ใน C แต่ตอนนี้ฉันสับสนกับสิ่งต่อไปนี้: char *p = "hello" นี่คือการชี้ตัวชี้ถ่านที่อาร์เรย์ตัวละครเริ่มต้นที่ชั่วโมง char p[] = "hello" นี่คืออาร์เรย์ที่จัดเก็บสวัสดี ความแตกต่างเมื่อฉันส่งตัวแปรทั้งสองไปยังฟังก์ชั่นนี้คืออะไร? void printSomething(char *p) { printf("p: %s",p); }
216 c  arrays  pointers 

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