עבור לתוכן

c - מחרוזות - בעיה בזמן ריצה

Featured Replies

פורסם

אני מנסה להריץ את קטע הקוד הבא,

ובשורת ההשמה ( 's = '5 )

התוכנית נתקעת.

השגיאה:

Unhandled exception at 0x76ed15de in ex4.exe: 0xC0000005: Access violation writing location 0x009a5798.

מה לעשות?

[size=78%]void my_itoa(int number, char s[]){[/size]
int i = 0;
for ( i = 0 ; number % 10 != 0 ; i++){
s[i] = '5';
number /= 10;
}
reverse(s);
}
void main(){
char *s;
s = "0";
my_itoa(78689, s);
printf("%s", s);
}

פורסם

בפונקציית ITOA שלך יש כתיבה לזיכרון שלא הוקצה.

אתה שולח מצביע כשהיית צריך לשלוח מצביע למערך של קצת הרבה יותר תוים.

פורסם

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

פורסם
  • מחבר

אבל כששולחים מצביע שה לא אמור לפתור את הבעיה של אורך המערך?

מה גם שזה נתקע כבר באיבר הראשון (גם כששלחתי מחרוזת יותר ארוכה).

פורסם

קודם כל, כשעשית "s="0 אז הגדרת את s להצביע למחרוזת באורך 1, דהיינו מערך באורך 2 (מקום אחד נוסף נדרש עבור ה-null terminator). אז כל גישה ממעבר לשני התווים הראשונים במערך היא דריסת זכרון.

חוץ מזה, וזה כבר תלוי במימוש הספציפי של הקומפילר, המחרוזת הקבועה "0" יושבת במקום בזכרון שלא בהכרח מותר לכתוב אליו. בקומפיילרים מסויימים הקוד הזה בכלל לא יתקמפל, כי הוא ידרוש ממך ש-s יהיה מטיפוס *const char (דהיינו, מצביע לזכרון שניתן רק לקרוא ממנו, ולא לכתוב אליו).

הדבר הנכון הוא להגדיר את s בתוך מערך סטטי, כלומר משהו כמו [char s[10, או להקצות אותו דינאמית באמצעות malloc, דהיינו (char s = (char*)malloc(10.

פורסם

אין לך מערך עד כמה שאני מבין, אתה מבקש מצביע ומקבל מצביע אבל אסור לך לכתוב לאן שהוא מצביע כי זה לא שייך לך מערך מגדירים ככה עד כמה שאני זוכר

int array[sizeofarray]
int array2[] = {1,2,3}

הראשון ייתן לך מערך בגודל שרצית והשני ייתן לך מערך באורך שלוש ש1 2 3 הם האיברים שלו.

אם אתה רוצה מצביע לאיבר הראשון במערך אתה צריך לעשות משהו כזה

int *ptr
ptr=&array[0]

זה לא בדיוק וחסר ; אבל בגדול זה מה שאני זוכר

עריכה: שניצל אתה יכול להסביר מה רשמת בשתי שורות הראשונות?

פורסם

כל מערך הוא כבר מצביע לאיבר הראשון שבו, כלומר הביטויים להלן שקולים:

ptr = array;
ptr = &array[0];

חוץ מזה לא מובן לי מה לא ברור בשתי השורות הראשונות...

פורסם

שים לב כי ביטוי מהסוג:

char* c = "something";

הוא חלק מהקוד (איפה הוא נשמר בזיכרון?) ואתה לא יודע עליו כלום - מבחינתך הוא read only.

ארכיון

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

דיונים חדשים