PDA

View Full Version : سوال در باره تخصیص حافظه در زبان C



snbb000
شنبه 04 آبان 1392, 20:18 عصر
سلام .
میشه کد زیر رو برای من توضیح بدید ؟
الان تابع malloc مگه نباید 1 بایت حافظه بگیره ؟ پس باید حداکثر 1 کلمه رو بشه ذخیره کرد ولی الان برنامه رو که اجرا کنید بیش از 12 کاراکتر هم ذخیره میکنه
چرا ؟
ممنون

کد :

#include <stdio.h>
#include <stdlib.h>
main()
{

char *x;
x = (char *) malloc(2);
scanf("%s",x);
printf("%s",x);

}

omidshaman
شنبه 04 آبان 1392, 21:43 عصر
شما این جا 2 بایت رو رزرو کردین توی C++‎/cمیشه بیشتر از این مقدار رو ریخت داخل x ولی اتفاقی که میقته اینه که چون ++c یا c طول آرایه رو چک نمی کنه مقدار ذخیره شده میره تو بقیه بلاک های خالیه حافظه فرض کن یک char *a دیگه هم داشتی باشی ممکنه بقیه اون 10 کاراکتر اضافی بره تو اون ذخیره بشه یا مثلا یک جای حساس حافظه ذخیره بشه برنامه کلا بسته بشه و....
ممکن هم هست چون فقط 2 بایت رزرو شده اون 10 بایت اضافه بعدا توسط بقیه قسمت های برنامه عوض شن .

rahnema1
شنبه 04 آبان 1392, 21:44 عصر
بر طبقداکیومنت لایبری استاندارد c تعریف شده توسط IBM وقتی که شما ازs% استفاده می کنید رشته ورودی در یک آرایه ذخیره میشه واگر شما مقدار پهنای ورودی رو تعیین نکنید مقدار پهنای ورودی یک مقدار بزرگ در نظر گرفته می شه بنابریان در موردی که شما اشاره کردید باید اینطوری قرار بدید:



scanf("%2s",x);

fahimeh1512
شنبه 04 آبان 1392, 21:49 عصر
سلام تابع malloc ب اندازه ای ک عدد بهش میدی حافظه تخصیص میده ولی اشاره گر ایکس ک تعریف کردی به ابتدای اون حافظه اشاره میکنه و کاری نداره اون حافظه چند بایته
بادستور scanf تو ادرس ایکس رشته شما وارد میشه رشته تون هرچقدر طول داشته باشه اخرش یه null قرار میگیره و تو حافظه موردنظر ذخیره میشه
با تابع printf اون رشته چاپ میشه یعنی اشاره گر تابع از اول ادرس ایکس شروع میکنه به چاپ کردن کاراکترا تا زمانی ک ب null برسه یعنی فرقی نمیکنه اون رشته طولش چقدر باشه
البته فکر کنم تو تابع printfباید ایکسو اینجوری میذاشتی
printf("%s",*x);

snbb000
چهارشنبه 22 آبان 1392, 10:19 صبح
خیلی ممنون از همه دوستانی که جواب دادن

پس با توجه به صحبت های همتون میشه اینو گفت که همونقدر حافظه گرفته میشه اما scanf نمیدونه ما چقدر حافظه گرفتیم و تا جایی که بدتونه مقادیر رو میگیره ؟ یعنی میره تو حافظه های بعدی درسته ؟

بازم ممنون

rahnema1
چهارشنبه 22 آبان 1392, 10:49 صبح
همان طور که در پست قبلی گفتم باید مقدار پهنا را در scanf وارد کنید که اگه معرفی کردید scanf میدونه چقدر حافظه اشغال کنه اگه معرفی نکردیم یک مقدار بزرگ را در نظر می گیره