עבור לתוכן

אתחול מבנה מורכב ב-C

Featured Replies

פורסם

היי,

יש לי מבנה שאחד השדות שלו הוא מערך של מבנים.

לכל אחד מהמבנים במערך, יש שדה מטיפוס int ושדה מטיפוס char*.

אני מעוניין לאתחל את המבנה החיצוני, כך שבכל אחד מהמבנים הפנימיים המספר יתאפס והמצביע יצביע לnull.

האם ישנה דרך יעילה לעשות זאת? (בלי לולאות למיניהן)

פורסם

כן, memset. אמנם יש בה לולאה פנימית (אי אפשר להמנע מלולאה), אבל היא הכי יעילה שאפשר.

פורסם

הוא בכל מקרה רץ n פעמים לא? (כמספר המבנים במערך).

פורסם
  • מחבר

כן, memset. אמנם יש בה לולאה פנימית (אי אפשר להמנע מלולאה), אבל היא הכי יעילה שאפשר.

ראיתי שmemset מטפלת בעיקר במחרוזות. איך הולך הסינטקס במקרה של מבנה?

פורסם

קודם כל, חיפוש של memset struct ייתן לך כל מיני תשובות מתאימות.

הפונקציה memset מקבלת מצביע p, מספר כלשהו n, וערך כלשהו value, והיא שמה את הערך הזה ברצף של n הבתים שמתחילים במקום שאליו מצביע p.

שים לב שלפונקציה לא איכפת אם p הוא מצביע ל-char,int או כל דבר אחר - היא מתייחסת אליו כאל מצביע ל-char.

על מנת לאפס מבנה, אתה פשוט צריך לאפס את כל הבתים בזכרון שהוא תופס.

כלומר, אם יש לך מבנה כזה:

struct ST {
int a;
char b;
int* c;
};

ST x;

אז בשביל לאתחל אותו, אתה צריך להעביר מצביע למיקום של x, ולומר ל-memset כמה בתים לאפס:

memset(&x, 0, sizeof(x));

אם יש לך מערך:

ST arr[10];

אז באותו אופן:

memset(arr, 0, sizeof(arr));

האופרטור sizeof מחזיר את גודל הטיפוס בבתים. שים לב שאם מדובר במערך דינמי:

ST* p = (ST*)malloc(sizeof(ST)*10);

אז לא יהיה טוב להעביר (sizeof(p, כי זה הגודל של המצביע. במקום זה, צריך:

memset(p, 0, sizeof(ST) * 10);

פורסם
  • מחבר

תודה רבה :yelclap:

ארכיון

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

דיונים חדשים