PDA

View Full Version : سوال: تفاوت تعریف دو متغیر دینامیک



<برنامه نویس>
جمعه 28 آبان 1389, 18:34 عصر
سلام دوستان من فرق این دو نوع تعریف متغیر های دینامیک رو نفهمیدم میشه بگید

کد اول :


int n;
scanf("%d",&n);
int a[n];

در این کد آرایه a به اندازه n ساخته میشه

کد دوم:



int *a;
int n;
scanf("%d",&n);
a=new int[n];


این کد هم این کارو میکنه
میشه بگید چه فرقی با هم دارن

mehdi.mousavi
جمعه 28 آبان 1389, 18:58 عصر
سلام.
تعریف اول حافظه مورد نظر رو از Stack می گیره، اما دومی از Heap.
توضیح مختصری در این ارتباط رو می تونید در این آدرس (http://ee.hawaii.edu/%7Etep/EE160/Book/chap14/subsection2.1.1.8.html) مطالعه کنید.

موفق باشید.

Update: من فقط منظورم نحوه تعریف متغیر بودش، و الا فرمایش جناب Geek1982 کاملا درسته.

r00tkit
جمعه 28 آبان 1389, 19:13 عصر
int n;
scanf("%d",&n);
int a[n];



این کد اشتباه هستش

برای اینکه از stack داینامیکی مموری بگیری از _alloca (http://msdn.microsoft.com/en-us/library/wb1s57t5.aspx)استفاده کن ( اینو من از استاد موسوی 2 هفته پیش یاد گرفتم استاد خودش هم 11 سال پیش از Paul DiLascia :لبخند:)

Salar Ashgi
جمعه 28 آبان 1389, 19:55 عصر
در زبانهای ++C,C بر خلاف زبان #C آرایه ها ذاتا استاتیک هستند و این به این معناست که سایز آرایه حتما باید قبل از اجرای برنامه مشخص باشد ؛ که با این اوصاف ساختار شماره اول شما در زبانهای C++,C اشتباه است .
آرایه استاتیک :


int a[10];

آرایه داینامیک :


int n;
cin>>n;
int *a = new int[n];

<برنامه نویس>
جمعه 28 آبان 1389, 21:55 عصر
int n;
scanf("%d",&n);
int a[n];



این کد اشتباه هستش

برای اینکه از stack داینامیکی مموری بگیری از _alloca (http://msdn.microsoft.com/en-us/library/wb1s57t5.aspx)استفاده کن ( اینو من از استاد موسوی 2 هفته پیش یاد گرفتم استاد خودش هم 11 سال پیش از Paul DiLascia :لبخند:)
این کد هم در сو هم در с++ کار میکنه -و هیچ خطایی نمیده -فقط فکرکنم از لحاظ تحصیص خافطه با هم فرق دارن

Salar Ashgi
جمعه 28 آبان 1389, 22:55 عصر
این کد هم در сو هم در с++ کار میکنه -و هیچ خطایی نمیده -فقط فکرکنم از لحاظ تحصیص خافطه با هم فرق دارن

نه خیر ؛ ساختار کد ذاتا اشتباه است ، عکسهای ضمیمه رو نگاه کنید و به خطاهای داده شده توسط
کامپایلر دقت کنید ؛ کامپایل شده در Borland 5.02 !

tdkhakpur
جمعه 28 آبان 1389, 23:22 عصر
این کد هم در сو هم در с++ کار میکنه -و هیچ خطایی نمیده -فقط فکرکنم از لحاظ تحصیص خافطه با هم فرق دارن
درسته نباید خطا بده ولی اصولی نیست چون در ظاهر این رو نشون میده که شما n رو پر میکنید بعد a مقدار فضا رو میگره ولی اینطور نیست اگر اصول کامپایلر و لینکر رو مطالعه کنید خواهید دانست که متغییرهای استاتیک اونهایی هستند که داخل سگمنت دیتا قرار میگیرند و در برنامه فوق هم قضیه به همین شکل هست یعنی متغییر باید موقع کامپایل مقدار دهی شده باشه نه موقع اجرا.
به همین دلیل چون موقع کامپایل این اتفاق رخ میده پس همه چی میتونه داخل n قرار داشته باشه لذا گرفتن خطا برای این کد نشان از هوشمند بودن کامپایلر داره نه دقت محاسبه و کدسازی.

<برنامه نویس>
جمعه 28 آبان 1389, 23:59 عصر
نه خیر ؛ ساختار کد ذاتا اشتباه است ، عکسهای ضمیمه رو نگاه کنید و به خطاهای داده شده توسط
کامپایلر دقت کنید ؛ کامپایل شده در Borland 5.02 !

این عکس رو نگاه کن درست کار میکنه

http://barnamenevis.org/forum/attachment.php?attachmentid=60555&stc=1&d=1290200141

<برنامه نویس>
شنبه 29 آبان 1389, 00:15 صبح
فرق اصلی در محل قرار گرفتن متغیر ها است یعنی وتی بصورت معمولی ذخیره میشه در stack قرار میگیره اما وقتی بصورت دینامیک تعریف میشه در heap قرار مگیره
فقط اینو نفهمیدم مقدار حافطه heap چه مقداره و هر برنامه این قسمت رو برای خودش داره

tdkhakpur
یک شنبه 30 آبان 1389, 12:42 عصر
فرق اصلی در محل قرار گرفتن متغیر ها است یعنی وتی بصورت معمولی ذخیره میشه در stack قرار میگیره اما وقتی بصورت دینامیک تعریف میشه در heap قرار مگیره
فقط اینو نفهمیدم مقدار حافطه heap چه مقداره و هر برنامه این قسمت رو برای خودش داره

پشته یا stack زمانی مورد استفاده قرار میگیره که شما پارامترهایی رو برای توابع تعریف کنید که در این صورت کامپایلر کد مربوطه را برای این action که مقادیر رو از پشته بگیره و داخل پارامترهای ارسال قرار بده رو در هنگام کامپایل بخ کدهای برنامه تان بصورت باینری اضافه میکنه و همچنن از stack برای برگشت با استفاده از کدهای iret و ret که مخصوص cpu و کار cpu هست مورد استفاده قرار میده.
اما heap فظایی از ram هست که شما با استفاده از malloc و یا سایر ابزار های دیگر از سیستم قرض میگیرید که در حالت حفاظت این فضا میتواند خاصیت دسترسی را هم داشته باشد و میتواند محدوده ram رو در بر داشته باشد.