لذت برنامه نویسی! در C متغیرها کجا تعریف می‌شوند

اینم یه تجربه پراکنده دیگه!

من مدت‌هاست که به عنوان یکی از کارهای اصلی به زبان C برای سیستم‌های Embeded برنامه می‌نویسم. یعنی یه دستگاه محدود رو آماده میکنم که یه کار خاص رو انجام بده.

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

اگه با اسمبلی آشنا باشید هر برنامه از سه قسمت Data, Code, Stack تعریف میشه. که خود  Data Segment هم از سه بخش Heap, Data, BSS تشکیل میشه. که توضیح هرکدوم این بخش‌ها داستان متفاوتی داره. حالا توی شبه کد پایین توضیح میدم که  اینها با هم چه تفاوتی داره

int a;

void myFunc(void)
{
	int b;
	static int c;
	int *d = malloc(sizeof(int));

	...

	return;
}

توی این شبه کد متغیر global به نام a وجود داره که توی data و یا ‌BSS تعریف میشه. متغیر b چون یک متغیر محلیه توی stack تعریف میشه. متغیر c یک متغیر محلی استایتک هست و به دلیل استاتیک بودنش توی data و یا ‌BSS تعریف میشه.  پوینتر d همه به یه آدرس توی heap اشاره میکنه چون این متغیر بصورت داینامیک تعریف شده و متغیر داینامیک در heap درست میشه. تفاوت data و BSS در اینه که متغیرهایی که مقدار اولیه غیر صفر دارن توی data تعریف میشن و متغیرهایی که مقدار اولیه ندارن و یا صفرن توی BSS تعریف میشن.

حالا مشکلی که وجود داشت اینه که من متغیرهای بزرگی توی متن تابع هام داشتم که باعث میشد حجم محدود stack موجود پر بشه و نرم افزار به خطای زمان اجرا بر بخوره. که با تغییر اونها به متغیرهای static محل نگهداری اونها به BSS یا Data تغییر مکان پیدا کرد و مساله حل شد.

همین!

۹ comments

    1. این توضیحات امیدوارم که کمک کنه.
      بسیاری از اوقات اتفاق میفته که متغیرها به اشتباه مقادیرشون تغییر میکنه. مثلا من برنامه نویس اشتباها یه از اسم یه متغیر به جای یه متغیر دیگه استفاده میکنم. حالا اگه متغیر global باشه چون از تمام نقاط برنامه در دسترس هست احتمال اتفاق افتادن این مشکل زیاده. کلا هدف اینه که با کم کردن دسترسی متغیر اون رو نصبت به تغییرات و حتی دسترسی ناخواسته محافظت کنیم. این موضوع اینقدر مهمه که در زبان‌های oop یه مفهومی به نام encapsulation وجود داره که هدفش همین کم کردن دسترسی به متغیرهاست.

  1. سلام
    ببخشید در زبان c اگه نتوانیم از ارایه برای مقایسه ی دو مقدار ک بصورت ۰ و ۱ نمایش داده میشوند استفاده کنیم چ راه دیگری داریم؟

    1. سلام

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

        1. سلام

          با strlen همونطور که اگه تعریف تابع بخونید نوشته فقط طول یک رشته از کارکترهای که به کارکتر \۰ ختم میشن رو به شما میده و اصلا هم سایز آرایه رو نمیشه باهاش حساب کرد. در بعضی موارد میشه از sizeof استفاده کرد. اما همیشه و در همه کامپایلرها sizeof با شرایط خاصی کار میکنه.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *