עבור לתוכן

שפת c - הקצאות דינאמיות

Featured Replies

פורסם
#include "stdlib.h"
int main()
{
 int **p;
 p = (int**)malloc(3*sizeof(int*));
 free(*p);//ok. but why?
 free(*p);//ok. but why?
 free(p);//ok. but why?
 free(p);// Run time error
 return 0;
}

לא מבין מדוע התכנית תקינה ורק בשורה האחרונה יש שגיאה בזמן ריצה ולא לפני כן. משהו בניהול הזיכרון הדינאמי שאני מפספס?

 

פורסם

כי עם free(NULL) לא קורה כלום

פורסם
  • מחבר

איפה יש פה נאל? מאלוק נותן ערכי זבל. לא?

ואם נאל לא עושה כלום אז למה יש שגיאה בפריי האחרון?

פורסם

אין לדעת מה היה לפני.

 

פריי אחד לפני אחרון מוחק ערך אמיתי, את ה-malloc.

והאחרון נותן שגיאה כי כבר מחקת אותו

פורסם
  • מחבר

זה מובן מה שהסברת. אז נותר לי להבין למה 2 ה free הראשונים תקינים

פורסם
ציטוט של ronen062013

אז נותר לי להבין למה 2 ה free הראשונים תקינים

כבר הסברתי. מאלוק לא מאתחל ל-0 אך אין זה אומר שלא הוקצה זיכרון מאותחל.

פורסם
  • מחבר

אז למה ה free השני לא עושה שגיאה כמו ה free הרביעי. ובכלל, אם כבר נעשה free על  *p אז למה מתאפשר לעשות free על p עצמו?

פורסם

free(0); לא מקריס כי יש בדיקה בפנים הפונקציה.

*p מבצע קריאה מבפנים המערך. ערך הארגומנט הינו 0.

p עצמו הינו הערך שמתקבל מ-malloc והינו מצביע למערך.

פורסם
  • מחבר

מובן. תודה רבה!!

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים