# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C > سوال: تفاوت تعریف دو متغیر دینامیک

## <برنامه نویس>

سلام دوستان من فرق این دو نوع تعریف متغیر های دینامیک رو نفهمیدم میشه بگید 

کد اول :

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

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

کد دوم:


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


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

----------


## mehdi.mousavi

سلام.
تعریف اول حافظه مورد نظر رو از Stack می گیره، اما دومی از Heap. 
توضیح مختصری در این ارتباط رو می تونید در این آدرس مطالعه کنید.

موفق باشید.

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

----------


## r00tkit

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


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

برای اینکه از stack داینامیکی مموری بگیری از   _alloca استفاده کن ( اینو من از استاد موسوی 2 هفته پیش یاد گرفتم استاد خودش هم 11 سال پیش از Paul DiLascia  :لبخند گشاده!: )

----------


## Salar Ashgi

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

int a[10];

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

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

----------


## <برنامه نویس>

> int n;
> scanf("%d",&n);
> int a[n];
>  
> 
> 
> این کد اشتباه هستش 
> 
> برای اینکه از stack داینامیکی مموری بگیری از _alloca استفاده کن ( اینو من از استاد موسوی 2 هفته پیش یاد گرفتم استاد خودش هم 11 سال پیش از Paul DiLascia )


 این کد هم در сو هم در с++ کار میکنه -و هیچ خطایی نمیده -فقط فکرکنم از لحاظ تحصیص خافطه با هم فرق دارن

----------


## Salar Ashgi

> این کد هم در сو هم در с++ کار میکنه -و هیچ خطایی نمیده -فقط فکرکنم از لحاظ تحصیص خافطه با هم فرق دارن


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

----------


## tdkhakpur

> این کد هم در сو هم در с++ کار میکنه -و هیچ خطایی نمیده -فقط فکرکنم از لحاظ تحصیص خافطه با هم فرق دارن


درسته نباید خطا بده ولی اصولی نیست چون در ظاهر این رو نشون میده که شما n رو پر میکنید بعد a مقدار فضا رو میگره ولی اینطور نیست اگر اصول کامپایلر و لینکر رو مطالعه کنید خواهید دانست که متغییرهای استاتیک اونهایی هستند که داخل سگمنت دیتا قرار میگیرند و در برنامه فوق هم قضیه به همین شکل هست یعنی متغییر باید موقع کامپایل مقدار دهی شده باشه نه موقع اجرا.
به همین دلیل چون موقع کامپایل این اتفاق رخ میده پس همه چی میتونه داخل n قرار داشته باشه لذا گرفتن خطا برای این کد نشان از هوشمند بودن کامپایلر داره نه دقت محاسبه و کدسازی.

----------


## <برنامه نویس>

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


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

----------


## <برنامه نویس>

فرق اصلی در محل قرار گرفتن متغیر ها است یعنی وتی بصورت معمولی ذخیره میشه در stack قرار میگیره اما وقتی بصورت دینامیک تعریف میشه در heap قرار مگیره 
فقط اینو نفهمیدم مقدار حافطه heap چه مقداره و هر برنامه این قسمت رو برای خودش داره

----------


## tdkhakpur

> فرق اصلی در محل قرار گرفتن متغیر ها است یعنی وتی بصورت معمولی ذخیره میشه در stack قرار میگیره اما وقتی بصورت دینامیک تعریف میشه در heap قرار مگیره 
> فقط اینو نفهمیدم مقدار حافطه heap چه مقداره و هر برنامه این قسمت رو برای خودش داره


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

----------

