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

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

4
photoshop ผสมผสานสองภาพเข้าด้วยกันอย่างไร? [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการ1 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ใครช่วยอธิบายวิธีการที่ Photoshop ผสมผสานภาพสองภาพเข้าด้วยกันเพื่อที่ฉันจะสร้างเอฟเฟกต์เดียวกันในแอปพลิเคชันของฉันได้

12
เหตุใด "อิสระ" ใน C จึงไม่ใช้จำนวนไบต์ที่จะทำให้เป็นอิสระ
เพื่อความชัดเจน: ฉันรู้mallocและfreeนำไปใช้ในไลบรารี C ซึ่งโดยปกติจะจัดสรรหน่วยความจำจากระบบปฏิบัติการและทำการจัดการของตัวเองเพื่อจัดเก็บหน่วยความจำจำนวนน้อยลงในแอปพลิเคชันและติดตามจำนวนไบต์ที่จัดสรร . คำถามนี้ไม่ได้เป็นวิธีการที่ไม่ฟรีรู้ว่าจะเป็นอิสระ แต่ฉันอยากรู้ว่าทำไมถึงfreeทำแบบนี้ตั้งแต่แรก ในฐานะที่เป็นภาษาระดับต่ำฉันคิดว่ามันเป็นเรื่องที่สมเหตุสมผลอย่างยิ่งที่จะขอให้โปรแกรมเมอร์ C ติดตามไม่เพียง แต่หน่วยความจำที่ได้รับการจัดสรร แต่เท่าไหร่ (อันที่จริงฉันมักจะพบว่าฉันติดตามจำนวนไบต์ malloced อยู่ดี) นอกจากนี้ยังเกิดขึ้นกับฉันที่การให้จำนวนไบต์อย่างชัดเจนfreeอาจอนุญาตให้มีการเพิ่มประสิทธิภาพประสิทธิภาพบางอย่างเช่นตัวจัดสรรที่มีพูลแยกต่างหากสำหรับขนาดการจัดสรรที่แตกต่างกันจะสามารถกำหนดพูลที่จะว่างเพียงแค่ดูที่อาร์กิวเมนต์อินพุตและ จะมีพื้นที่เหนือศีรษะโดยรวมน้อยลง ดังนั้นในระยะสั้นเหตุใดจึงถูกสร้างmallocและfreeสร้างขึ้นเช่นนี้จึงจำเป็นต้องติดตามจำนวนไบต์ที่จัดสรรไว้ภายใน เป็นเพียงอุบัติเหตุทางประวัติศาสตร์หรือไม่? การแก้ไขเล็กน้อย: มีคนไม่กี่คนที่ให้คะแนนเช่น "จะเกิดอะไรขึ้นถ้าคุณได้รับเงินจำนวนที่แตกต่างจากที่คุณจัดสรรให้" API ในจินตนาการของฉันอาจต้องการเพียงแค่หนึ่งเพื่อให้เป็นอิสระตามจำนวนไบต์ที่จัดสรร การปล่อยให้ว่างมากหรือน้อยอาจเป็นเพียง UB หรือการนำไปใช้ ฉันไม่ต้องการกีดกันการอภิปรายเกี่ยวกับความเป็นไปได้อื่น ๆ

3
ทำไมมูลค่าส่งคืนฟรีของนักแสดงจึงเป็นโมฆะ?
ฉันกำลังอ่านหนังสือ ( การเขียนโปรแกรมด้วย POSIX Threadsโดย Butenhof, 1997) ที่ใช้ C และฉันเจอบรรทัดต่อไปนี้: (void)free(data); นี่dataเป็นเพียงตัวชี้ไปยังโครงสร้างที่ปันส่วน data = malloc(sizeof(my_struct_t)); ทำไมเป็นผลมาจากfreeการถูกโยนไปvoid? จากความเข้าใจของฉันเกี่ยวกับ C สิ่งนี้ดูเหมือนจะไม่สมเหตุสมผลด้วยสองเหตุผล: ฟังก์ชันฟรีส่งคืนแล้ว void รหัสไม่ได้ใช้ค่าส่งคืน (มันไม่ได้ถูกกำหนดให้กับตัวแปร) หนังสือเล่มนี้เขียนขึ้นในปี 1997 นี่เป็นเรื่องของมรดกหรือเปล่า ผู้เขียนกล่าวว่าตัวอย่างทำงานบน Digital Unix 4.0d แต่ฉันก็ยังนึกภาพไม่ออกว่ามีเหตุผลอะไรที่จะส่งผลของฟังก์ชั่นหากคุณไม่ได้ใช้ผลลัพธ์นั้น
82 c  casting  free  void  legacy-code 

8
การลบจำนวนเต็ม 8 บิตในจำนวนเต็ม 64- บิตโดย 1 ในแบบขนาน, SWAR โดยไม่มีฮาร์ดแวร์ SIMD
ถ้าฉันมีจำนวนเต็ม 64- บิตที่ฉันตีความเป็นอาร์เรย์ของจำนวนเต็ม 8 บิตที่บรรจุด้วย 8 องค์ประกอบ ฉันต้องลบค่าคงที่1จากจำนวนเต็มที่บรรจุแต่ละตัวขณะจัดการล้นโดยไม่มีผลลัพธ์ขององค์ประกอบหนึ่งที่มีผลต่อผลลัพธ์ขององค์ประกอบอื่น ฉันมีรหัสนี้ในขณะนี้และใช้งานได้ แต่ฉันต้องการวิธีแก้ปัญหาที่การลบของแต่ละจำนวนเต็ม 8 บิตบรรจุในแบบคู่ขนานและไม่ทำให้การเข้าถึงหน่วยความจำ ใน x86 ฉันสามารถใช้คำสั่ง SIMD เช่นpsubbนั้นลบจำนวนเต็ม 8 บิตพร้อมกัน แต่แพลตฟอร์มที่ฉันกำลังเข้ารหัสไม่รองรับคำแนะนำ SIMD (RISC-V ในกรณีนี้) ดังนั้นฉันจึงพยายามที่จะทำSWAR (SIMD ภายในการลงทะเบียน)เพื่อยกเลิกการเผยแพร่ด้วยตนเองระหว่างไบต์ของ a uint64_tทำสิ่งที่เทียบเท่ากับสิ่งนี้: uint64_t sub(uint64_t arg) { uint8_t* packed = (uint8_t*) &arg; for (size_t i = 0; i < sizeof(uint64_t); ++i) { packed[i] -= 1; …
77 c++  c  bit-manipulation  simd  swar 

7
ฉันสามารถใช้ NULL แทนค่า 0 ได้หรือไม่?
ฉันได้รับอนุญาตให้ใช้NULLตัวชี้แทนค่า0ใช่หรือไม่ หรือมีอะไรผิดปกติเกี่ยวกับการทำเช่นนั้น? ตัวอย่างเช่น: int i = NULL; เพื่อทดแทนสำหรับ: int i = 0; ในการทดลองฉันรวบรวมรหัสต่อไปนี้: #include <stdio.h> int main(void) { int i = NULL; printf("%d",i); return 0; } เอาท์พุท: 0 อันที่จริงมันทำให้ฉันเตือนนี้ซึ่งถูกต้องสมบูรณ์ด้วยตัวเอง: warning: initialization makes integer from pointer without a cast [-Wint-conversion] แต่ผลลัพธ์ยังคงเท่าเดิม ฉันกำลังเข้าสู่ "พฤติกรรมที่ไม่ได้กำหนด" กับสิ่งนี้หรือไม่? อนุญาตให้ใช้NULLในลักษณะนี้ได้ไหม มีอะไรผิดปกติNULLไหมในการใช้เป็นค่าตัวเลขในนิพจน์เชิงคณิตศาสตร์? และผลลัพธ์และพฤติกรรมใน C ++ สำหรับกรณีนี้คืออะไร ฉันได้อ่านคำตอบของอะไรคือความแตกต่างระหว่างโมฆะ …

10
ไม่สามารถรวบรวมโปรแกรม C บน Mac หลังจากอัปเกรดเป็น Catalina 10.15
มีคำถามก่อนหน้านี้ไม่สามารถรวบรวมโปรแกรม C บน Mac หลังจากอัปเกรดเป็น Mojaveและคำตอบที่ครอบคลุมส่วนใหญ่ของรูปแบบที่ผิดพลาด ตอนนี้ - ตั้งแต่วันจันทร์ที่ 2019-10-07 - คุณสามารถอัปเกรดเป็น macOS Catalina 10.15 อีกครั้งระหว่างการอัปเกรด/usr/includeไดเรกทอรีได้ถูกยกเลิกไปโดยการอัพเดตแม้ว่าจะติดตั้ง XCode 11.0 ก่อนการอัปเกรด (จาก Mojave 10.14.6) ไปยัง Catalina ดังนั้นคอมไพเลอร์ที่สร้างขึ้นเพื่อคาดหวังว่าจะมี/usr/includeไดเรกทอรีไม่ทำงานอีกต่อไป ขั้นตอนหลักที่แนะนำสำหรับปัญหา Mojave - การใช้คำสั่ง: open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg ไม่ทำงานจากเกตเพราะ/Library/Developer/CommandLineTools/Packages/ไม่มีไดเรกทอรี(ดังนั้นยังไม่มี.pkgไฟล์ที่จะเปิด) มีวิธีที่ดี (เป็นทางการ) ในการสร้างและเติมไดเรกทอรี/usr/includeหรือไม่
64 c  xcode  macos  gcc  macos-catalina 

4
ความต้องการของวงเล็บปีกกาว่างเปล่า '{}' ในตอนท้ายของอาร์เรย์ struct คืออะไร?
ฉันกดรหัสc ใน Linux kernel: static struct ctl_table ip_ct_sysctl_table[] = { { .procname = "ip_conntrack_max", .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, }, // ... { .procname = "ip_conntrack_log_invalid", .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = &log_invalid_proto_min, .extra2 = &log_invalid_proto_max, }, { } }; …

4
อะไร ((เป็นโมฆะ (*) ()) buf) (); หมายความว่าอย่างไร
ฉันกำลังแก้ไขปัญหาการแสวงหาผลประโยชน์แบบไบนารีบน picoCTF และพบกับโค้ดชิ้นนี้: ((void (*)())buf)(); ที่bufเป็นอาร์เรย์ตัวอักษร ฉันแก้ไขความท้าทาย แต่ดูเหมือนจะไม่เข้าใจว่ามันทำอะไรอยู่ ฉันดูที่กระทู้นี้แต่ฉันไม่สามารถทำให้มันออกมาได้ อะไร((void (*)())buf)();หมายถึง?

4
สร้างคำเตือนคอมไพเลอร์หากเครื่องหมายจุลภาคการเริ่มต้น const char * array หายไป
ฉันใช้ตารางตัวอักษรเป็นจำนวนมากในรหัส C ของฉัน ตารางเหล่านี้ทั้งหมดดูเหมือนมากขึ้นหรือน้อยลง: static const char* const stateNames[STATE_AMOUNT] = { "Init state", "Run state", "Pause state", "Error state", }; ปัญหาของโค้ดข้างต้นคือถ้าตารางยาวขึ้นและถูกแก้ไขระหว่างการพัฒนาฉันลืมเครื่องหมายจุลภาคเป็นครั้งคราว คอมไพล์รหัสโดยไม่ต้องมีปัญหากับเครื่องหมายจุลภาคหายไป แต่ปลายโปรแกรมของฉัน up crashing NULLเป็นสตริงที่ผ่านมามีการตั้งค่า ฉันใช้คอมไพเลอร์ MinGW และ Keil เพื่อตรวจสอบ มีวิธีใดในการสร้างคำเตือนคอมไพเลอร์สำหรับการเริ่มต้นของฉันหากคอมม่าหายไป?
53 c  initialization 

6
(x | y) - y ทำไมมันไม่เป็นแค่ x หรือแม้แต่ `x | 0`
ฉันกำลังอ่านรหัสเคอร์เนลและที่เดียวที่ฉันเห็นนิพจน์ภายในifคำสั่งเช่น if (value == (SPINLOCK_SHARED | 1) - 1) { ............ } โดยที่SPINLOCK_SHARED = 0x80000000เป็นค่าคงที่ที่กำหนดไว้ล่วงหน้า ฉันสงสัยว่าทำไมเราต้องใช้(SPINLOCK_SHARED | 1) - 1เพื่อการแปลงประเภท ผลลัพธ์ของนิพจน์จะเป็น 80000000 - เหมือนกับ 0x80000000 ใช่ไหม แต่ทำไม ORing 1 และ Subtracting 1 ถึงสำคัญ? มีความรู้สึกเหมือนว่าฉันพลาดที่จะรับบางสิ่งบางอย่าง ..

5
ลำดับการประเมินดัชนีอาเรย์ (กับนิพจน์) ใน C
ดูรหัสนี้: static int global_var = 0; int update_three(int val) { global_var = val; return 3; } int main() { int arr[5]; arr[global_var] = update_three(2); } รายการอาร์เรย์ใดที่ได้รับการอัปเดต 0 หรือ 2 มีส่วนหนึ่งในสเปคของ C ที่บ่งบอกถึงความสำคัญของการดำเนินงานในกรณีนี้หรือไม่?

2
เหตุใดที่อยู่ของ argc และ argv 12 ไบต์แยกกัน
ฉันรันโปรแกรมต่อไปนี้บนคอมพิวเตอร์ของฉัน (Intel 64 บิตที่ใช้ Linux) #include <stdio.h> void test(int argc, char **argv) { printf("[test] Argc Pointer: %p\n", &argc); printf("[test] Argv Pointer: %p\n", &argv); } int main(int argc, char **argv) { printf("Argc Pointer: %p\n", &argc); printf("Argv Pointer: %p\n", &argv); printf("Size of &argc: %lu\n", sizeof (&argc)); printf("Size of &argv: %lu\n", sizeof (&argv)); …

2
เหตุใดสวิตช์จึงไม่ปรับให้เหมาะสมในลักษณะเดียวกับการผูกมัดในกรณีอื่นใน c / c ++
การดำเนินการตามตารางต่อไปนี้จะสร้างชุดของคำสั่ง cmp / je อย่างที่ฉันคาดหวังว่าจะถูกล่ามโซ่หากข้อความ: int square(int num) { if (num == 0){ return 0; } else if (num == 1){ return 1; } else if (num == 2){ return 4; } else if (num == 3){ return 9; } else if (num == 4){ return 16; } else if …

6
เหตุใดจึงมีการอ้างสิทธิ์การยกเลิกการลงทะเบียนประเภทตัวชี้คำเตือนเฉพาะคอมไพเลอร์?
ฉันได้อ่านโพสต์ต่างๆ ในStack Overflow RE: ข้อผิดพลาดพอยน์เตอร์ที่พิมพ์ผิดประเภท ความเข้าใจของฉันคือข้อผิดพลาดโดยพื้นฐานแล้วคำเตือนของคอมไพเลอร์เกี่ยวกับอันตรายของการเข้าถึงวัตถุผ่านตัวชี้ประเภทอื่น (แม้ว่าจะมีข้อยกเว้นเกิดขึ้น) ซึ่งเป็นคำเตือนที่เข้าใจได้และสมเหตุสมผล char* คำถามของฉันเฉพาะรหัสด้านล่าง: เหตุใดการกำหนดที่อยู่ของตัวชี้ให้มีvoid**คุณสมบัติสำหรับคำเตือนนี้ (เลื่อนเป็นข้อผิดพลาดผ่าน-Werror) ยิ่งไปกว่านั้นโค้ดนี้ได้รับการรวบรวมสำหรับสถาปัตยกรรมเป้าหมายหลาย ๆ อันซึ่งหนึ่งในนั้นเท่านั้นที่สร้างคำเตือน / ข้อผิดพลาด - นี่อาจหมายถึงว่ามันเป็นข้อบกพร่องเฉพาะรุ่นคอมไพเลอร์อย่างถูกกฎหมายหรือไม่ // main.c #include <stdlib.h> typedef struct Foo { int i; } Foo; void freeFunc( void** obj ) { if ( obj && * obj ) { free( *obj ); *obj = …
38 c  pointers  casting 

3
ไม่สามารถส่งอักขระ '#' เป็นอาร์กิวเมนต์บรรทัดคำสั่ง
ฉันไม่สามารถส่งผ่านสตริงที่ขึ้นต้นด้วย#อาร์กิวเมนต์บรรทัดคำสั่ง นี่คือการทดสอบอย่างง่าย: #include <stdio.h> int main(int argc, char *argv[]) { for (int i = 1; i < argc; i++) printf("%s ", argv[i]); putchar('\n'); return 0; } หากฉันป้อนอาร์กิวเมนต์ดังนี้: 2 4 # 5 6 ค่าของargcเป็นและไม่ได้3 6มันอ่าน#และหยุดอยู่แค่นั้น ผมไม่ทราบว่าทำไมและผมก็ไม่สามารถหาคำตอบในสำเนาของฉันของภาษา C ProgrammingและC รองพื้นพลัส

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