discord icon
سرور دیسکورد گاردایران

پست های پیشنهاد شده

سلام و درود خدمت همگی دوستان.

 

همونجور که میدونید در زبان C وقتی یک آرایه تعریف می کنیم تعداد عناصر اون باید مشخص باشه و این تعداد غیرقابل تغییر هست.

 

متغیرهایی مثل متغیرهای زیر در حافظه استک (Stack) ذخیره می شوند.

char a;
int b;
float c;
char d[10];
...

حافظه متغیرهایی که در استک ذخیره می شوند به صورت خودکار بعد از استفاده، آزاد می شود.

 

برای اینکه بتونیم در زمان اجرای برنامه میزان حافظه یک متغیر را مشخص کنیم باید از حافظه هیپ (Heap) استفاده کنیم.

حافظه متغیرهایی که در هیپ ذخیره می شوند برخلاف متغیرهای استک به صورت خودکار، آزاد نمی شود و برنامه نویس باید زمانی که دیگر به آن حافظه نیاز ندارد، آن را آزاد کند.

در غیر این صورت این حافظه تا زمان پایان برنامه اشغال شده باقی می ماند تا زمانی که برنامه به پایان رسیده و سیستم عامل منابع را پس بگیرد.

 

چهار تابع در زبان سی برای مدیریت حافظه وجود دارد که عبارتند از: malloc, calloc, free و realloc.

این توابع در فایل هدر stdlib.h قرار دارند.

 

تابع malloc:

این تابع میزان حافظه مورد نیاز به بایت را گرفته و درصورتی که این مقدار حافظه وجود داشته باشه یک اشاره گر (Pointer) به آن بر میگرداند.

#include <stdio.h>
#include <stdlib.h>

int main() {
  int *ptr;
  ptr = (int*) malloc(10 * sizeof(int));
  
  if (ptr == NULL) {
    printf("Can't allocate memory\n");
    exit(-1);
  }
  
  return 0;
}

در کد بالا ۱۰ ضربدر سایز int شده و به این معنی است که به اندازه ۱۰ اینتیجر حافظه به ptr اختصاص داده شود.

در صورتی که این مقدار حافظه موجود باشد یک اشاره گر به آن برگردانده میشود و در غیر این صورت ptr برابر با NULL می شود.

 

تابع calloc:

این تابع شباهت زیادی به malloc دارد.

دو ورودی می گیرد که اولی تعداد عناصر آرایه و دومی سایز هر عنصر است.

#include <stdio.h>
#include <stdlib.h>

int main() {
  char *ptr;
  ptr = (char*) calloc(5, sizeof(char));
  
  if (ptr == NULL) {
    printf("Can't allocate memory\n");
    exit(-1);
  }

  return 0;
}

 

تفاوت malloc و calloc در این است که malloc حافظه تخصیص داده شده را مقداردهی اولیه نمی کند ولی calloc حافظه را با صفر مقداردهی اولیه می کند.

 

تابع free:

همانطور که گفتیم حافظه های اختصاص داده شده به صورت خودکار آزاد نمی شوند.

برای آزاد کردن حافظه باید از تابع free استفاده کنیم.

این تابع یک اشاره گر به حافظه را می گیرد و آن حافظه را آزاد می کند.

#include <stdio.h>
#include <stdlib.h>
  
int main() {
  int *ptr;
  ptr = malloc(100 * sizeof(int));
  
  if (ptr == NULL)
  	exit(-1);
  
  ...
    
  free(ptr);
  
  return 0;
}

 

تابع realloc:

این تابع برای تغییر اندازه حافظه اختصاص داده شده استفاده می شود.

پارامتر اول آن اشاره گر به حافظه و پارامتر دوم میزان حافظه جدید است.

#include <stdio.h>
#include <stdlib.h>
  
int main() {
  int *ptr;
  ptr = (int*) malloc(2 * sizeof(int));
  
  if (ptr == NULL)
    exit(-1);
  
  ptr[0] = 100;
  ptr[1] = 200;
  
  ptr = (int*) realloc(ptr, 3 * sizeof(int));
  if (ptr == NULL)
    exit(-1);
  
  ptr[2] = 300;
  
  printf("%d %d %d\n", ptr[0], ptr[1], ptr[2]);
  
  free(ptr);
  
  return 0;
}

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری