פונקציית realloc בשפת סי

פונקציית realloc בשפת סי

1. האם ניתן להשתמש ב-realloc בלי שימוש ב-malloc לפני?

2. אני משתמש ב-realloc בלולאה (כל איטרציה רוצה להוסיף איבר) ומקבל NULL מהפונקציה. מה יכולה להיות הסיבה?

תודה מראש לעוזרים.
 
בנוסף משהו קטן

האם חייב לעשות השמה לערך המוחזר מ-realloc או שאפשר ככה:
נניח ש- str* אותחל כבר.
האם השורה הבאה תקינה (לא עושה השמה לערך המוחזר אבל מצפה ש-str יאותחל לשטח החדש)
realloc(str,sizeof(int)*number);
 

BravoMan

Active member
את כל התשובות ניתן למצוא בתיעוד של הפונקציה

שזמין ב-man וגם באינטרנט, אבל אחזור עליהן כאן לשם נוחות:
&nbsp
1. כן, ניתן להשתמש ב-realloc כמו ב-malloc אם מעבירים לה NULL בתור הפרמטר הראשון היא מתפקדת בדיוק כמו malloc.
&nbsp
2. בהמשך ל-1, הפונקציה מחזירה NULL בשני מקרים:
א) אם היא נכשלת בהקצאה כמו malloc
ב) אם העברת בתור פרמטר שני גודל 0, והפונקציה עשתה עבודה של free - כלומר שחררה זיכרון במקום להקצות.
&nbsp
3. השורה שלך לא תקינה.
זה חוקי מבחינת שפת C להתעלם מערך חוזר, אבל אם תקרא בתיעוד תראה שכאשר realloc לא יכולה להקצות מחדש במקום הנתון (למשל, כי אין שם בלוק רציף בגודל המתאים) היא עשויה להעביר את כל הזיכרון למקום אחר, ואז להחזיר מצביע למקום החדש שיהיה שונה מהמצביע שהעברת לה בתור הפרמטר הראשון.
&nbsp
כאמור, זה לא תמיד קורה, וזה תלוי במצב הזיכרון כשהתוכנה שלך רצה וגודל ההקצאות שאתה מנסה לעשות, אז לפעמים השורה שלך תצליח, ולפעמים היא תגרום לזליגת זיכרון ודריסת נתונים.
&nbsp
אל תשתמש בה!
 
תודה ההסבר ממש עזר לי. אם אפשר רק הבהרה קטנה

האם קטע קוד הבא תקין:

קוד:
1. int *arr;
2. arr=realloc(arr,sizrof(int)*length);
או שחייב בין השורה הראשונה לשנייה להכניס:

arr=(int*)realloc(NULL,sizeof(int)*1);
 

BravoMan

Active member
הקטע אינו תקין!

ב-C, משתנים לא מאותחלים אוטומטית, לכן, אין לך דרך לדעת מה יהיה ב-arr בדוגמה הראשונה.

אבל, אתה לא חייב לעשות סתם הקצאה בגודל 1.
מספיק שבזמן הגדרה תאפס את arr כך:
int *arr = NULL;
ברוב המקרים ב-C מומלץ לאתחל משתנים בעת הכרזה כדי להימנע מערכים אקראיים!
 
למעלה