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

ฟังก์ชัน malloc ทำการจัดสรรหน่วยความจำแบบไดนามิกใน C และเป็นส่วนหนึ่งของไลบรารีมาตรฐาน ใช้แท็กนี้สำหรับคำถามเกี่ยวกับการใช้งานพฤติกรรมและการใช้งาน malloc

28
ฉันจะส่งผลของ malloc หรือไม่?
ในคำถามนี้มีคนแนะนำในการแสดงความคิดเห็นว่าฉันไม่ควรแสดงผลลัพธ์mallocเช่น int *sieve = malloc(sizeof(int) * length); ค่อนข้างมากกว่า: int *sieve = (int *) malloc(sizeof(int) * length); ทำไมถึงเป็นเช่นนี้?
2407 c  malloc  casting 


17
จะเกิดอะไรขึ้นเมื่อคุณไม่ว่างหลังจาก malloc?
นี่เป็นสิ่งที่รบกวนฉันมานานแล้ว เราทุกคนได้รับการสอนในโรงเรียน (อย่างน้อยฉันเป็น) ที่คุณต้องเป็นอิสระทุกตัวชี้ที่ได้รับการจัดสรร แต่ฉันก็อยากรู้อยากเห็นเกี่ยวกับต้นทุนที่แท้จริงของการไม่เพิ่มหน่วยความจำ ในบางกรณีที่เห็นได้ชัดเช่นเมื่อmallocมีการเรียกภายในลูปหรือส่วนหนึ่งของการประมวลผลเธรดเป็นสิ่งสำคัญมากที่จะต้องว่างดังนั้นจึงไม่มีหน่วยความจำรั่วไหล แต่ลองพิจารณาสองตัวอย่างต่อไปนี้: ก่อนอื่นถ้าฉันมีรหัสนั่นเป็นอย่างนี้: int main() { char *a = malloc(1024); /* Do some arbitrary stuff with 'a' (no alloc functions) */ return 0; } ผลลัพธ์ที่แท้จริงที่นี่คืออะไร ความคิดของฉันคือกระบวนการตายแล้วพื้นที่ฮีปก็หายไปดังนั้นจึงไม่มีอันตรายใด ๆ ในการที่จะพลาดการเรียกfree(แต่ฉันตระหนักถึงความสำคัญของการมีมันต่อไปสำหรับการปิดการบำรุงรักษาและการปฏิบัติที่ดี) ฉันคิดถูกไหม? ประการที่สองสมมติว่าฉันมีโปรแกรมที่ทำหน้าที่เหมือนเชลล์ ผู้ใช้สามารถประกาศตัวแปรเช่นaaa = 123นั้นและจะถูกเก็บไว้ในโครงสร้างข้อมูลแบบไดนามิกบางอย่างเพื่อใช้ในภายหลัง เห็นได้ชัดว่าดูเหมือนว่าคุณจะใช้วิธีแก้ปัญหาบางอย่างที่จะเรียกใช้ฟังก์ชันการจัดสรร * บางอย่าง (hashmap, รายการที่ลิงก์, สิ่งที่คล้ายกัน) สำหรับโปรแกรมประเภทนี้มันไม่สมเหตุสมผลเลยที่จะโทรฟรีmallocเพราะตัวแปรเหล่านี้จะต้องปรากฏตลอดเวลาในระหว่างการดำเนินการของโปรแกรมและไม่มีวิธีที่ดี (ที่ฉันเห็น) ในการดำเนินการนี้ด้วยการจัดสรรพื้นที่แบบคงที่ เป็นการออกแบบที่ไม่ดีที่จะมีหน่วยความจำจำนวนมากที่จัดสรรไว้ แต่ปล่อยให้เป็นอิสระซึ่งเป็นส่วนหนึ่งของกระบวนการที่สิ้นสุด ถ้าเป็นเช่นนั้นทางเลือกคืออะไร?
538 c  malloc  free 

19
ฉันใช้ malloc และ / หรือใหม่ในกรณีใดบ้าง
ฉันเห็นใน C ++ มีหลายวิธีในการจัดสรรและฟรีข้อมูลและฉันเข้าใจว่าเมื่อคุณโทรmallocคุณควรโทรfreeและเมื่อคุณใช้newโอเปอเรเตอร์คุณควรจับคู่deleteและเป็นความผิดพลาดในการผสมสองอย่าง (เช่นการโทรหาfree()บางสิ่งที่สร้างขึ้น กับnewผู้ดำเนินการ) แต่ฉันไม่ชัดเจนว่าควรใช้malloc/ freeและเมื่อใดควรใช้new/ deleteในโปรแกรมในโลกแห่งความเป็นจริง หากคุณเป็นผู้เชี่ยวชาญ C ++ โปรดแจ้งให้เราทราบกฎเกณฑ์หรือหลักการที่คุณปฏิบัติตามในเรื่องนี้

25
ทำไมการใช้ alloca () จึงไม่ถือว่าเป็นแนวปฏิบัติที่ดี?
alloca()malloc()หน่วยความจำที่จัดสรรในกองมากกว่าในกองเช่นในกรณีของ ดังนั้นเมื่อฉันกลับจากรูทีนหน่วยความจำจะถูกปล่อยให้เป็นอิสระ ดังนั้นที่จริงแล้วสิ่งนี้แก้ปัญหาของฉันในการเพิ่มหน่วยความจำที่จัดสรรแบบไดนามิก การเพิ่มจำนวนของหน่วยความจำที่จัดสรรผ่านmalloc()นั้นเป็นเรื่องที่น่าปวดหัวอย่างมากและหากพลาดไปก็จะทำให้เกิดปัญหาหน่วยความจำทุกประเภท ทำไมการใช้งานalloca()ท้อแท้ทั้งๆที่มีคุณสมบัติข้างต้น?
400 c  stack  malloc  allocation  alloca 

13
malloc () และ free () ทำงานอย่างไร
ฉันต้องการทราบวิธีการmallocและการfreeทำงาน int main() { unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char)); memset(p,0,4); strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes** cout << p; free(p); // Obvious Crash, but I need how it works and why crash. cout << p; return 0; } ฉันจะขอบคุณจริง ๆ ถ้าคำตอบอยู่ในระดับความลึกในระดับหน่วยความจำถ้าเป็นไปได้

3
ทำไม malloc + memset ช้ากว่า calloc
เป็นที่รู้จักกันว่าcallocแตกต่างจากmallocที่เริ่มต้นการจัดสรรหน่วยความจำ ด้วยcallocหน่วยความจำถูกตั้งค่าเป็นศูนย์ ด้วยmallocหน่วยความจำจะไม่ถูกล้างออก ดังนั้นในการทำงานในชีวิตประจำวันผมถือว่าcallocเป็น+malloc memsetบังเอิญเพื่อความสนุกฉันได้เขียนโค้ดต่อไปนี้เพื่อเป็นเกณฑ์มาตรฐาน ผลที่ได้คือความสับสน รหัส 1: #include<stdio.h> #include<stdlib.h> #define BLOCK_SIZE 1024*1024*256 int main() { int i=0; char *buf[10]; while(i<10) { buf[i] = (char*)calloc(1,BLOCK_SIZE); i++; } } ผลลัพธ์ของรหัส 1: time ./a.out **real 0m0.287s** user 0m0.095s sys 0m0.192s รหัส 2: #include<stdio.h> #include<stdlib.h> #include<string.h> #define BLOCK_SIZE 1024*1024*256 int main() { int …
256 c  malloc 


1
ทำไมหนังสือ“ The C Programming Language” ถึงบอกว่าฉันต้องโยน malloc?
วันนี้ผมมาถึงหน้า167ของภาษา C Programming (ฉบับที่สองไบรอัน W. Kernighan และเดนนิสเอ็ม Ritchie)mallocและพบว่าผู้เขียนบอกว่าผมต้องทิ้ง นี่คือส่วนหนึ่งจากหนังสือ: 7.8.5 การจัดการพื้นที่เก็บข้อมูล ฟังก์ชัน malloc และ calloc รับบล็อกของหน่วยความจำแบบไดนามิก void *malloc(size_t n) ส่งคืนตัวชี้ไปยัง n ไบต์ของที่เก็บข้อมูลที่ไม่กำหนดค่าเริ่มต้นหรือ NULL ถ้าไม่สามารถดำเนินการตามคำขอได้ void *calloc(size_t n, size_t size) ส่งกลับตัวชี้ไปยังพื้นที่ว่างเพียงพอสำหรับอาร์เรย์ของวัตถุ n ขนาดที่ระบุหรือ NULL ถ้าคำขอไม่สามารถตอบสนอง ที่เก็บข้อมูลถูกเตรียมใช้งานเป็นศูนย์ ตัวชี้ที่ส่งคืนโดย malloc หรือ calloc มีการจัดตำแหน่งที่เหมาะสมสำหรับวัตถุที่เป็นปัญหา แต่ต้องถูกส่งลงในประเภทที่เหมาะสมเช่นเดียวกับใน int *ip; ip = (int *) calloc(n, sizeof(int)); ผมรู้อยู่แล้วว่าmalloc(และครอบครัว) …

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

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 

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


3
วิธีที่แปลกประหลาดในการจัดสรรอาร์เรย์สองมิติ?
ในโครงการมีใครบางคนผลักดันบรรทัดนี้: double (*e)[n+1] = malloc((n+1) * sizeof(*e)); ซึ่งคาดว่าจะสร้างอาร์เรย์สองมิติของ (n + 1) * (n + 1) เป็นสองเท่า คาดคะเนผมพูดเพราะเพื่อให้ห่างไกลไม่มีใครฉันถามจะบอกฉันว่านี้ไม่ว่าหรือที่มันมาจากหรือทำไมมันควรจะทำงาน (ซึ่งถูกกล่าวหาว่ามันไม่ แต่ฉันยังไม่ได้ซื้อมัน) บางทีฉันอาจพลาดบางอย่างที่ชัดเจน แต่ฉันจะขอบคุณถ้ามีใครสามารถอธิบายข้างต้นให้ฉัน เพราะโดยส่วนตัวแล้วฉันจะรู้สึกดีขึ้นมากถ้าเราจะใช้สิ่งที่เราเข้าใจจริงๆ

8
Malloc vs new - padding ที่แตกต่างกัน
ฉันกำลังตรวจสอบรหัส C ++ ของผู้อื่นสำหรับโครงการของเราที่ใช้ MPI สำหรับการประมวลผลประสิทธิภาพสูง (10 ^ 5 - 10 ^ 6 คอร์) รหัสนี้มีวัตถุประสงค์เพื่อให้สามารถสื่อสารระหว่าง (อาจ) เครื่องจักรที่แตกต่างกันในสถาปัตยกรรมที่แตกต่างกัน เขาเขียนความคิดเห็นที่กล่าวถึงบางสิ่งตามบรรทัดของ: ปกติเราจะใช้newและdeleteแต่ที่นี่ผมใช้และmalloc freeสิ่งนี้จำเป็นเนื่องจากคอมไพเลอร์บางตัวจะเพิ่มข้อมูลแตกต่างกันเมื่อnewใช้งานซึ่งนำไปสู่ข้อผิดพลาดในการถ่ายโอนข้อมูลระหว่างแพลตฟอร์มต่างๆ mallocนี้ไม่ได้เกิดขึ้นกับ สิ่งนี้ไม่เข้ากับสิ่งที่ฉันรู้จากคำถามมาตรฐานnewเทียบกับmallocคำถาม อะไรคือความแตกต่างระหว่าง new / delete และ malloc / free? บอกใบ้ถึงแนวคิดที่ว่าคอมไพเลอร์สามารถคำนวณขนาดของวัตถุได้แตกต่างกัน (แต่เหตุใดจึงแตกต่างจากการใช้sizeof) malloc และตำแหน่งใหม่กับใหม่เป็นคำถามที่ได้รับความนิยมพอสมควร แต่พูดถึงการnewใช้ตัวสร้างmallocเท่านั้นซึ่งไม่เกี่ยวข้องกับสิ่งนี้ malloc เข้าใจการจัดตำแหน่งอย่างไร บอกว่าหน่วยความจำได้รับการรับรองว่าจัดวางอย่างถูกต้องnewหรือmallocเป็นสิ่งที่ฉันเคยคิดไว้ก่อนหน้านี้ ฉันเดาว่าเขาวินิจฉัยจุดบกพร่องของตัวเองผิดพลาดในอดีตและอนุมานได้ว่าnewและmallocให้จำนวนช่องว่างที่แตกต่างกันซึ่งฉันคิดว่าอาจไม่เป็นความจริง แต่ฉันไม่พบคำตอบใน Google หรือคำถามก่อนหน้านี้ ช่วยฉันด้วย StackOverflow คุณเป็นความหวังเดียวของฉัน!

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