02-11-2008, 01:59
|
|
|
חבר מתאריך: 08.10.08
הודעות: 177
|
|
בתגובה להודעה מספר 1 שנכתבה על ידי dorM שמתחילה ב "(שפת C) להקצות מקום למערך חד-מימדי מסוג char * ?"
ציטוט:
במקור נכתב על ידי dorM
אני רוצה ליצור מערך המכיל את שמות הימים, לדוגמא, ואני עושה זאת באופן הבא:
קוד:
char *arr[] = { "Sunday", "Monday" /* etc. */ };
האם הדרך הנ"ל נחשבת "חוקית"\"תקנית"\"מקובלת"?
|
זה חוקי ותקני. השאלה היא האם זה עושה את מה שאתה רוצה. char הוא מערך של מצביעים. המערך מאותחל להצביע לכתובות של המחרוזות "Sunday", "Monday" וכו'.
ציטוט:
במקור נכתב על ידי dorM
הרי אני יודע שכאשר משתמשים במצביע, חובה להקצות לו מקום לפני הכנסת מידע (ומנגד, כאן אני לא מקצה מקום למחרוזות של הימים).
משום מה כאשר הצהרתי על המערך הסטטי הנ"ל וכתבתי את הקוד הבא:
קוד:
for (i=0; i<7; )
printf("%s", arr[i++]);
זה עבד טוב, לא היו בעיות כלל.
|
כשאתה עובד עם מצביע, ברגע שיצרת אותו הקצית לו מקום. התכוונת להגיד זה שחובה שהמצביע יצביע לזיכרון שהוקצה גם הוא, ובמקרה שאתה לא משתמש בזיכרון של מישהו אחר, אתה חייב להקצות לו מקום. לדוגמה:
קוד:
int *pi = 0;
// *pi = 5
// is illegal, since pi doesn't point to a valid int
pi = (int*)malloc(sizeof(int));
*pi = 12;
free(pi);
כאן אני מקצה זיכרון ל-int, שם את הכתובת של הזיכרון הזה ב-pi ועובד איתו.
אצלך יש מערך (arr[]) של מצביעים (char*). הגודל של המערך שלך הוא 7*4=28 בתים. זה משתנה שהגדרת וההגדרה שלו מקצה לו זיכרון.
את המערך איתחלת עם הכתובות של המחרוזות "Sunday", "Monday" וכו'. כל מחרוזת שאתה כותב בקוד C שלך שייכת לאחד משני מקרים: אתחול של מערך של תווים (לא המקרה שלך), וכל מקרה אחר. בכל מקרה אחר היא הופכת למערך אנונימי של תווים שמאוחסן היכנשהו בזיכרון. אז כאן יש לנו שבעה מערכים אנונימיים של תווים שמאוחסנים היכנשהו בזיכרון, ובתוך arr[] נמצאות הכתובות שלהם. הזיכרון לכל מחרוזת תווים מהסוג השני מוקצה ברגע שכותבים אותה בקוד.
למען השלמות נציין שהמקרה הראשון הוא רק כשכותבים משהו כזה:
קוד:
char string[] = "string";
כשכותבים, לדוגמה:
קוד:
char *string = "string"
מדובר כבר במקרה השני - יש מצביע בשם string שמצביע למערך תווים אנונימי שהתוכן שלו הוא "string". (ו-NULL בסוף)
ציטוט:
במקור נכתב על ידי dorM
שאלה נוספת:
האם בקוד הנ"ל (של ההצהרה על המערך),
מה שאני עושה זה מצביע אחד ל-X איברים במערך שהוא מצביע על ה-char הראשון באיבר הראשון,
או,
שזה X מצביעים כמספר איברי המערך, וכל אחד מהם מצביע על ה-char הראשון בכל איבר שבמערך?
|
מה שאתה עושה, כמו שכתבתי למעלה, זה מערך אחד בשם arr[] בגודל 28 בתים שמכיל 7 מצביעים, שכל אחד מהם מצביע לתו הראשון של המחרוזות שיצרת.
ציטוט:
במקור נכתב על ידי dorM
שאלה בנושא אחר:
איפה ב-VS אני יכול ליצור פרויקט שיתקמפל לפי תקן C90 ?
יש שם כל מיני אפשרויות ואני לא מבין בהם בכלל...
|
אא"כ אתה משתמש בגרסה מאוד ישנה של VS, הקוד שלך מתקמפל בצורה שדי תואמת את C89/C90. תמיכה ב-C99 לא נראה שיש כוונה להוסיף.
ציטוט:
במקור נכתב על ידי dorM
תודה רבה!
|
תודה לך.
|