نمایش نتایج 1 تا 10 از 10

نام تاپیک: تفاوت تعریف دو متغیر دینامیک

  1. #1

    تفاوت تعریف دو متغیر دینامیک

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

    کد اول :

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

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

    کد دوم:


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


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

  2. #2

    نقل قول: تفاوت تعریف دو متغیر دینامیک

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

    موفق باشید.

    Update: من فقط منظورم نحوه تعریف متغیر بودش، و الا فرمایش جناب Geek1982 کاملا درسته.
    آخرین ویرایش به وسیله mehdi.mousavi : جمعه 28 آبان 1389 در 19:20 عصر

  3. #3

    نقل قول: تفاوت تعریف دو متغیر دینامیک


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



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

    برای اینکه از stack داینامیکی مموری بگیری از _alloca استفاده کن ( اینو من از استاد موسوی 2 هفته پیش یاد گرفتم استاد خودش هم 11 سال پیش از Paul DiLascia )
    Kernel Mode Developer
    RootKitSMM@Yahoo.com

  4. #4

    نقل قول: تفاوت تعریف دو متغیر دینامیک

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

    int a[10];

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

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






  5. #5

    نقل قول: تفاوت تعریف دو متغیر دینامیک

    نقل قول نوشته شده توسط geek1982 مشاهده تاپیک

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



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

    برای اینکه از stack داینامیکی مموری بگیری از _alloca استفاده کن ( اینو من از استاد موسوی 2 هفته پیش یاد گرفتم استاد خودش هم 11 سال پیش از Paul DiLascia )
    این کد هم در сو هم در с++ کار میکنه -و هیچ خطایی نمیده -فقط فکرکنم از لحاظ تحصیص خافطه با هم فرق دارن

  6. #6

    نقل قول: تفاوت تعریف دو متغیر دینامیک

    این کد هم در сو هم در с++ کار میکنه -و هیچ خطایی نمیده -فقط فکرکنم از لحاظ تحصیص خافطه با هم فرق دارن
    نه خیر ؛ ساختار کد ذاتا اشتباه است ، عکسهای ضمیمه رو نگاه کنید و به خطاهای داده شده توسط
    کامپایلر دقت کنید ؛ کامپایل شده در Borland 5.02 !
    عکس های ضمیمه عکس های ضمیمه






  7. #7
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    ایران سرای من است
    پست
    2,655

    نقل قول: تفاوت تعریف دو متغیر دینامیک

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

  8. #8

    نقل قول: تفاوت تعریف دو متغیر دینامیک

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

    عکس های ضمیمه عکس های ضمیمه

  9. #9

    نقل قول: تفاوت تعریف دو متغیر دینامیک

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

  10. #10
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    ایران سرای من است
    پست
    2,655

    نقل قول: تفاوت تعریف دو متغیر دینامیک

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

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •