עבור לתוכן

חוות דעת על מימוש למחסנית שעשיתי בC

Featured Replies

פורסם

לא משהו.

קודם כל אתה מוגבל ל-10 איברים.

ואם כבר החלטת על הגבלה לפחות תדאג שלא תעבור אותה בפונקציה push.

אחת הבעיות הכי גדולות באבטחה של תוכנה היא buffer overflow שזה מצב שאתה עובר את גודל הבאפר שלך ומתחיל לכתוב למקום בזיכרון שלא שלך.

פורסם
  • מחבר

אתה יכול להיות יותר ספציפי?

כי אני עשיתי בדיקה לא לעבור את ההגבלה שיש

if(p->index==STACKINT_SIZE-1) return;

ולא הבנתי איפו יש סכנה buffer overflow

וההגבלה היא על 100

תודה על התגובה המהירה ;D

פורסם

אוקיי באמת הגנת מ-buffer overflow, טעות שלי :-X

הבעיה היחידה עם הקוד שלך שהוא מוגבל ל-100 והוא פשוט ביזבוז גדול של זיכרון במידה ואתה רוצה מחסנית קטנה.

יותר יפה ונכון לממש מחסנית עם רשימה מקושרת.

פורסם
  • מחבר

אם אני עושה את זה אם רשימה מקושרת אז אני מתחיל אם האיבר הראשון

אז אני צריך לעבור עד לאחרון או יש דרך מהירה להגיעה לתא האחרון?

פורסם

לא ממש...

כל הרעיון במימוש של מחסנית עם רשימה מקושרת זה שאתה מכניס ומוציא איברים מראש הרשימה

אתה צריך להחזיק מצביע לתחילת הרשימה

בהכנסה של איבר - המצביע הגלובלי יציביע לאיבר הזה והוא יצביע למצביע הגלובלי הישן.

בהוצאה של איבר - המצביע הגלובלי יצביע לאיבר השני ותחזיר את האיבר הראשון.

פורסם
  • מחבר

תודה רבה לך על התגובות שלך ועל ההסבר ;D

פורסם
  • מחבר

שיפרתי את הקוד והעברתי אותו לרשימה מקושרת אני יודע שאין בדיקה על הערך של הMALLOC

אבל חוץ מזה אני חושב שזה בסדר

http://members.lycos.co.uk/moroses/Uploads/Stack/Stack.htm

אשמח לקבל תגובות טובות ורעות(מקווה שאין הרבה :-\)

פורסם

בפונקציה SL_push יש שיכפול קוד, כל ההפרדה למקרים מיותרת

מספיק לעשות

void SL_push(StackList *S,value_type V) {

struct Stack *T=NULL;

T=MALLOC;

T->next=S->Top;

T->value=V;

S->Top=T;

}

חוץ מזה הכל נראה בסדר (לא הרצתי את את זה)

ארכיון

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

דיונים חדשים