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

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

7
ถ่านมีการเซ็นชื่อหรือไม่ได้ลงนามโดยค่าเริ่มต้น?
ในหนังสือ "Complete Reference of C" ได้มีการกล่าวไว้ว่า charเป็นค่าเริ่มต้นที่ไม่ได้ลงชื่อ แต่ฉันพยายามที่จะตรวจสอบกับ GCC และ Visual Studio มันคือการเป็นลงนามโดยค่าเริ่มต้น อันไหนที่ถูก?
158 c  types  char  signed 

9
วิธีใช้ C socket API ใน C ++ บน z / OS
ฉันมีปัญหาได้รับ C ซ็อกเก็ต API เพื่อการทำงานที่ถูกต้องในบนC++z/OS ถึงแม้ว่าผมกำลังรวมทั้งsys/socket.hผมยังคงได้รับข้อผิดพลาดรวบรวมเวลาบอกฉันว่าไม่ได้กำหนดไว้AF_INET ฉันขาดอะไรบางอย่างที่ชัดเจนหรือเกี่ยวข้องกับความจริงที่ว่าสิ่งที่z/OSเกิดขึ้นทำให้ปัญหาของฉันซับซ้อนมากขึ้นหรือไม่? ปรับปรุง : จากการตรวจสอบเพิ่มเติมฉันพบว่ามีสิ่ง#ifdefที่ฉันกำลังกดปุ่ม เห็นได้ชัดว่าz/OSไม่มีความสุขนอกจากว่าฉันจะกำหนดซ็อกเก็ต "ประเภท" ที่ฉันใช้ด้วย: #define _OE_SOCKETS ตอนนี้ฉันเองก็ไม่รู้ว่า_OE_SOCKETSมันคืออะไรจริง ๆ แล้วดังนั้นถ้ามีz/OSนักเขียนโปรแกรมซ็อกเก็ตอยู่ที่นั่น (คุณทั้ง 3 คน) บางทีคุณอาจให้ฉันดูว่ามันทำงานอย่างไร แอปทดสอบ #include <sys/socket.h> int main() { return AF_INET; } รวบรวม / ลิงค์ผลลัพธ์: cxx -Wc,xplink -Wl,xplink -o inet_test inet.C "./inet.C", line 5.16: CCN5274 (S) The name lookup for "AF_INET" …
158 c++  c  sockets  mainframe  zos 

24
ธง GCC ที่มีประโยชน์สำหรับ C
นอกเหนือจากการตั้งค่า-Wallและการตั้งค่า-std=XXXแล้วมีประโยชน์อื่น ๆ อีกมากมาย แต่มีการรวบรวมค่าสถานะคอมไพเลอร์น้อยกว่าที่ใช้ใน C? ฉันสนใจเป็นพิเศษในการเตือนเพิ่มเติมและ / หรือการเปลี่ยนคำเตือนเป็นข้อผิดพลาดในบางกรณีเพื่อลดความไม่ตรงกันของประเภทอุบัติเหตุใด ๆ
157 c  gcc  compiler-flags 

11
memcpy () vs memmove ()
ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างmemcpy()และmemmove()และฉันได้อ่านข้อความที่memcpy()ไม่ดูแลแหล่งที่มาและปลายทางที่ทับซ้อนกันในขณะที่memmove()ทำ อย่างไรก็ตามเมื่อฉันรันทั้งสองฟังก์ชั่นนี้บนบล็อคหน่วยความจำที่ทับซ้อนกันทั้งคู่ก็ให้ผลลัพธ์เหมือนกัน ตัวอย่างเช่นใช้ตัวอย่าง MSDN ต่อไปนี้ในmemmove()หน้าวิธีใช้: - มีตัวอย่างที่ดีกว่าที่จะเข้าใจข้อเสียmemcpyและวิธีการmemmoveแก้ไขหรือไม่ // crt_memcpy.c // Illustrate overlapping copy: memmove always handles it correctly; memcpy may handle // it correctly. #include <memory.h> #include <string.h> #include <stdio.h> char str1[7] = "aabbcc"; int main( void ) { printf( "The string: %s\n", str1 ); memcpy( str1 + 2, str1, …
157 c  memcpy  memmove 

22
การวางแนววัตถุใน C
อะไรจะเป็นชุดของแฮ็ก preprocessor ดี (เข้ากันได้กับ ANSI C89 / ISO C90) ซึ่งเปิดใช้การวางแนววัตถุที่น่าเกลียด (แต่ใช้งานได้) ใน C? ฉันคุ้นเคยกับภาษาเชิงวัตถุต่าง ๆ ดังนั้นโปรดอย่าตอบด้วยคำตอบเช่น "เรียนรู้ C ++!" ฉันได้อ่าน " การเขียนโปรแกรมเชิงวัตถุด้วย ANSI C " (ระวัง: รูปแบบ PDF ) และวิธีแก้ปัญหาที่น่าสนใจอื่น ๆ แต่ฉันสนใจ :-)! ดูเพิ่มเติมคุณสามารถเขียนโค้ดเชิงวัตถุใน C ได้หรือไม่
157 c  oop  object 

10
มีข้อเสียในการผ่าน structs ตามค่าใน C แทนที่จะส่งตัวชี้หรือไม่?
มีข้อเสียในการผ่าน structs ตามค่าใน C แทนที่จะส่งตัวชี้หรือไม่? หาก struct มีขนาดใหญ่จะเห็นได้ชัดว่าการดำเนินการด้านการคัดลอกข้อมูลจำนวนมาก แต่สำหรับโครงสร้างที่มีขนาดเล็กก็ควรจะเหมือนกับการส่งผ่านค่าหลายค่าไปยังฟังก์ชัน มันอาจจะน่าสนใจยิ่งขึ้นเมื่อใช้เป็นค่าตอบแทน C มีค่าส่งคืนเดียวจากฟังก์ชัน แต่บ่อยครั้งที่คุณต้องการหลายค่า ดังนั้นวิธีง่ายๆคือใส่พวกมันไว้ในโครงสร้างและคืนสิ่งนั้น มีเหตุผลอะไรหรือขัดกับสิ่งนี้? เนื่องจากอาจไม่ชัดเจนสำหรับทุกคนที่ฉันกำลังพูดถึงที่นี่ฉันจะยกตัวอย่างง่ายๆ หากคุณกำลังเขียนโปรแกรมใน C คุณจะเริ่มเขียนฟังก์ชันที่มีลักษณะดังนี้: void examine_data(const char *ptr, size_t len) { ... } char *p = ...; size_t l = ...; examine_data(p, l); นี่ไม่ใช่ปัญหา ปัญหาเดียวคือคุณต้องเห็นด้วยกับเพื่อนร่วมงานของคุณซึ่งลำดับพารามิเตอร์ควรเป็นเช่นนั้นเพื่อให้คุณใช้หลักการเดียวกันในทุกฟังก์ชั่น แต่จะเกิดอะไรขึ้นเมื่อคุณต้องการส่งคืนข้อมูลประเภทเดียวกัน โดยปกติคุณจะได้รับสิ่งนี้: char *get_data(size_t *len); { ... *len = ...datalen...; …

9
ทำไมต้องใช้ bzero มากกว่า memset?
ในคลาสการเขียนโปรแกรมระบบที่ฉันเอาภาคการศึกษาก่อนหน้านี้เราต้องใช้ไคลเอนต์ / เซิร์ฟเวอร์ขั้นพื้นฐานในซีเมื่อเริ่มต้น structs เช่นsock_addr_inหรือบัฟเฟอร์บัฟเฟอร์ (ที่เราใช้ในการส่งข้อมูลไปมาระหว่างไคลเอนต์และเซิร์ฟเวอร์) อาจารย์ สั่งให้เราใช้เท่านั้นbzeroและไม่memsetเริ่มต้นพวกเขา เขาไม่เคยอธิบายว่าทำไมและฉันอยากรู้ว่ามีเหตุผลที่ถูกต้องสำหรับสิ่งนี้หรือไม่? ฉันดูที่นี่: http://fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdownที่bzeroมีประสิทธิภาพมากขึ้นเนื่องจากความจริงที่ว่าจะเป็นศูนย์ความจำเท่านั้นดังนั้นมันจึงไม่ ต้องทำการตรวจสอบเพิ่มเติมใด ๆ ที่memsetอาจทำ ที่ยังคงไม่จำเป็นต้องดูเหมือนเหตุผลที่จะไม่ใช้อย่างแน่นอนmemsetสำหรับหน่วยความจำ zeroing bzeroถือว่าเลิกใช้แล้วและไม่ใช่ฟังก์ชัน C มาตรฐาน ตามคู่มือmemsetเป็นที่ต้องการมากกว่าbzeroด้วยเหตุผลนี้ ดังนั้นทำไมคุณยังต้องการใช้bzeroมากกว่าmemset? เพื่อประสิทธิภาพที่เพิ่มขึ้นหรือเป็นอะไรที่มากกว่านี้หรือ ในทำนองเดียวกันสิ่งที่มีประโยชน์memsetมากกว่าbzeroที่ทำให้มันเป็นตัวเลือกที่ต้องการโดยพฤตินัยสำหรับโปรแกรมที่ใหม่กว่า?

23
การตั้งค่าตัวแปรเป็น NULL หลังจากว่าง
ใน บริษัท ของฉันมีกฎการเข้ารหัสที่บอกว่าหลังจากพ้นหน่วยความจำใด ๆ NULLตั้งค่าตัวแปร ตัวอย่างเช่น ... void some_func () { int *nPtr; nPtr = malloc (100); free (nPtr); nPtr = NULL; return; } ฉันรู้สึกว่าในกรณีเช่นรหัสที่แสดงด้านบนการตั้งค่าเป็นNULLไม่มีความหมายใด ๆ หรือว่าฉันขาดอะไรไป? หากไม่มีความหมายในกรณีเช่นนี้ฉันจะดำเนินการกับ "ทีมคุณภาพ" เพื่อลบกฎการเข้ารหัสนี้ โปรดให้คำแนะนำ.

6
จะทำความเข้าใจกับ Hashing Sensitive ท้องถิ่นได้อย่างไร?
ฉันสังเกตเห็นว่า LSH ดูเหมือนจะเป็นวิธีที่ดีในการค้นหารายการที่คล้ายกันที่มีคุณสมบัติมิติสูง หลังจากอ่านกระดาษhttp://www.slaney.org/malcolm/yahoo/Slaney2008-LSHTutorial.pdfฉันยังคงสับสนกับสูตรเหล่านั้น ไม่มีใครรู้บล็อกหรือบทความที่อธิบายว่าเป็นวิธีที่ง่าย?

5
การเปลี่ยนบิตขึ้นอยู่กับ endianness หรือไม่?
สมมติว่าฉันมีหมายเลข'numb'=1025 [00000000 00000000 00000100 00000001]แสดง: บนเครื่อง Little-Endian: 00000001 00000100 00000000 00000000 บนเครื่อง Big-Endian: 00000000 00000000 00000100 00000001 ตอนนี้ถ้าฉันใช้ Left Shift บน 10 บิต (เช่น: numb << = 10) ฉันควรมี: [A] บนเครื่อง Little-Endian: ดังที่ฉันสังเกตเห็นใน GDB Little Endian ทำ Shift ซ้ายใน 3 ขั้นตอน: [ฉันได้แสดงขั้นตอน '3' เพื่อให้เข้าใจการประมวลผลดีขึ้นเท่านั้น] ปฏิบัติต่อหมายเลข ในอนุสัญญา Big-Endian: 00000000 00000000 00000100 …
156 c  endianness 

9
ตัวแปรของฉันถูกเก็บไว้ในหน่วยความจำที่ไหน
โดยพิจารณาว่าหน่วยความจำแบ่งออกเป็นสี่ส่วน: data, heap, stack และ code โดยที่ตัวแปรโกลบอล, ตัวแปรสแตติก, ชนิดข้อมูลคงที่, ตัวแปรโลคัล (กำหนดและประกาศในฟังก์ชัน), ตัวแปร (ในฟังก์ชั่นหลัก), พอยน์เตอร์ และพื้นที่ที่จัดสรรแบบไดนามิก (โดยใช้ malloc และ calloc) จะถูกเก็บไว้ในหน่วยความจำหรือไม่? ฉันคิดว่าพวกเขาจะได้รับการจัดสรรดังนี้: ตัวแปรโกลบอล -------> ข้อมูล ตัวแปรคงที่ -------> ข้อมูล ประเภทข้อมูลคงที่ -----> รหัส ตัวแปรท้องถิ่น (ประกาศและกำหนดไว้ในฟังก์ชั่น) --------> สแต็ค ตัวแปรที่ประกาศและกำหนดในฟังก์ชั่นหลัก -----> heap พอยน์เตอร์ (ตัวอย่างเช่นchar *arr, int *arr) -------> heap พื้นที่ที่จัดสรรแบบไดนามิก (โดยใช้ malloc และ calloc) --------> …

5
การประกาศโดยนัยที่เข้ากันไม่ได้ของฟังก์ชันในตัว 'malloc'
ฉันได้รับข้อผิดพลาดนี้: คำเตือน: การประกาศโดยนัยที่เข้ากันไม่ได้ของฟังก์ชันในตัว 'malloc' ฉันพยายามทำสิ่งนี้: fileinfo_list* tempList = malloc(sizeof(fileinfo_list)); สำหรับการอ้างอิงโครงสร้างที่ใช้ในมือคือ: typedef struct { fileinfo** filedata; size_t nFiles; size_t size; size_t fileblock; } fileinfo_list; ฉันไม่เห็นอะไรผิดปกติกับสิ่งที่ฉันทำ ฉันแค่การสร้างtempListที่มีขนาด 1 fileinfo_listx
155 c  struct  malloc 

21
แยกสตริงด้วยตัวคั่นใน C
ฉันจะเขียนฟังก์ชันเพื่อแยกและส่งกลับอาร์เรย์สำหรับสตริงที่มีตัวคั่นในภาษาการเขียนโปรแกรม C ได้อย่างไร char* str = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC"; str_split(str,',');
155 c  string  split 

7
ความแม่นยำ 'ลอย' เทียบกับ 'สองเท่า'
รหัส float x = 3.141592653589793238; double z = 3.141592653589793238; printf("x=%f\n", x); printf("z=%f\n", z); printf("x=%20.18f\n", x); printf("z=%20.18f\n", z); จะให้ผลลัพธ์ x=3.141593 z=3.141593 x=3.141592741012573242 z=3.141592653589793116 โดยที่บรรทัดที่สามของการส่งออก741012573242เป็นขยะและในบรรทัดที่สี่116คือขยะ คู่ผสมมีตัวเลขสำคัญ 16 ตัวเสมอหรือไม่ในขณะที่ลอยตัวมีตัวเลขสำคัญ 7 ตัวอยู่เสมอ? ทำไมคู่ไม่ได้มี 14 ตัวเลขที่สำคัญ?
155 c  floating-point 

5
ยังรั่วไหลได้ที่ตรวจพบโดย Valgrind
ฟังก์ชั่นทั้งหมดที่กล่าวถึงในบล็อกนี้เป็นฟังก์ชั่นห้องสมุด ฉันจะแก้ไขการรั่วไหลของหน่วยความจำนี้ได้อย่างไร มันอยู่ภายใต้หมวดหมู่" ยังเข้าถึงได้ " (มีอีก 4 ซึ่งคล้ายกันมาก แต่มีขนาดแตกต่างกัน) 630 bytes in 1 blocks are still reachable in loss record 5 of 5 at 0x4004F1B: calloc (vg_replace_malloc.c:418) by 0x931CD2: _dl_new_object (dl-object.c:52) by 0x92DD36: _dl_map_object_from_fd (dl-load.c:972) by 0x92EFB6: _dl_map_object (dl-load.c:2251) by 0x939F1B: dl_open_worker (dl-open.c:255) by 0x935965: _dl_catch_error (dl-error.c:178) by 0x9399C5: _dl_open …
155 c  pthreads  valgrind 

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