আমার ভেরিয়েবলগুলি সি তে কোথায় সঞ্চিত আছে?


156

মেমোরিটিকে চারটি বিভাগে বিভক্ত করা হয়েছে তা বিবেচনা করে: ডেটা, হিপ, স্ট্যাক এবং কোড, যেখানে গ্লোবাল ভেরিয়েবল, স্ট্যাটিক ভেরিয়েবল, ধ্রুবক ডেটা টাইপ, স্থানীয় ভেরিয়েবল (ফাংশনগুলিতে সংজ্ঞায়িত এবং ঘোষিত), ভেরিয়েবল (মূল ফাংশনে), পয়েন্টার , এবং গতিশীলভাবে বরাদ্দ স্থান (malloc এবং কলোক ব্যবহার করে) মেমরিতে সঞ্চয় হয়?

আমি মনে করি যে তারা নীচে বরাদ্দ করা হবে:

  • গ্লোবাল ভেরিয়েবল -------> ডেটা
  • স্ট্যাটিক ভেরিয়েবল -------> ডেটা
  • ধ্রুব ডেটা ধরণের -----> কোড
  • স্থানীয় ভেরিয়েবল (ঘোষিত এবং ফাংশনগুলিতে সংজ্ঞায়িত) --------> স্ট্যাক
  • ভেরিয়েবলগুলি মূল ফাংশন -----> গাদাতে ঘোষিত ও সংজ্ঞায়িত
  • পয়েন্টার (উদাহরণস্বরূপ char *arr, int *arr) -------> গাদা
  • গতিশীলভাবে বরাদ্দ স্থান (malloc এবং কলোক ব্যবহার করে) --------> স্ট্যাক

আমি কেবলমাত্র সি দৃষ্টিকোণ থেকে এই পরিবর্তনগুলি উল্লেখ করছি।

আমি সি তে নতুন হওয়ায় আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন


4
প্রকারগুলি মেমরিতে সংরক্ষণ করা হয় না।

5
mainএটি অন্য একটি ফাংশন। ভেরিয়েবলগুলি mallocঅন্য কোথাও না চাইলে স্ট্যাকের উপরে চলে যায়।
সাইমনক

4
পয়েন্টারগুলি (সাধারণত) স্ট্যাকের উপর সঞ্চিত থাকে। তারা যে স্মৃতিটি নির্দেশ করে (সাধারণত ম্যালোক / কলোকের মাধ্যমে বরাদ্দ করা হয়) হিপটিতে থাকে (সাধারণত)।
জেএমএম

3
গতিশীলভাবে বরাদ্দ স্থান (malloc, কলোক ব্যবহার করে) --------> গাদা
ওয়ান ম্যান ক্রু

3
ভেরিয়েবলগুলি মূল ফাংশন -----> স্ট্যাকে ঘোষিত ও সংজ্ঞায়িত
ওয়ান ম্যান ক্রু

উত্তর:


217

আপনি এর মধ্যে কিছু অধিকার পেয়েছেন, তবে যে কেউ প্রশ্ন লিখেছেন তিনি কমপক্ষে একটি প্রশ্নের উপর ঝুঁকছেন:

  • গ্লোবাল ভেরিয়েবল -------> ডেটা (সঠিক)
  • স্ট্যাটিক ভেরিয়েবল -------> ডেটা (সঠিক)
  • ধ্রুবক ডেটা ধরণের -----> কোড এবং / অথবা ডেটা। স্ট্রিং আক্ষরিক বিবেচনা করুন কোনও পরিস্থিতিতে যখন একটি ধ্রুবক নিজেই ডেটা বিভাগে সংরক্ষণ করা হবে এবং এর উল্লেখগুলি কোডে এম্বেড করা হবে
  • স্থানীয় ভেরিয়েবল (ক্রিয়াকলাপে ঘোষিত ও সংজ্ঞায়িত) --------> স্ট্যাক (সঠিক)
  • ভেরিয়েবলগুলি ঘোষিত এবং mainফাংশনে সংজ্ঞায়িত -----> গাদা এছাড়াও স্ট্যাক (শিক্ষক আপনাকে ঠকানোর চেষ্টা করছে)
  • পয়েন্টার (উদা: char *arr, int *arr) -------> গাদা ডেটা বা স্ট্যাক, প্রসঙ্গ উপর নির্ভর করে। সি আপনাকে একটি গ্লোবাল বা একটি staticপয়েন্টার ঘোষণা করতে দেয় , সেক্ষেত্রে পয়েন্টার নিজেই ডেটা বিভাগে শেষ হয়ে যায়।
  • পরিবর্তনশীল স্থান বরাদ্দ (ব্যবহার malloc, calloc, realloc) --------> স্ট্যাক গাদা

এটি উল্লেখযোগ্য যে "স্ট্যাক" আনুষ্ঠানিকভাবে "স্বয়ংক্রিয় স্টোরেজ ক্লাস" নামে পরিচিত।


6
এছাড়াও উল্লেখযোগ্য যে, গাদাটি আনুষ্ঠানিকভাবে কিছু বলা হয় না। বরাদ্দকৃত স্মৃতি কোথাও থেকে আসে, সেই "কোথাও" এর কোনও মান নেই।
স্টিভ জেসোপ

6
কিছু সিস্টেমে (যেমন লিনাক্স এবং * বিএসডি) এর allocaমতো কাজ mallocকরে তবে বরাদ্দকে স্ট্যাক করে।
আন্দ্রেয়াস গ্রেপেন্টিন

কোন পদ্ধতির অভ্যন্তরে কনস্ট ভেরিয়েবল কোথায় যায়?
মাহোরি

@ রবি একই স্থানে বাকী ধ্রুবকগুলি যান (পয়েন্ট # 3 উপরে)।
dasblinkenlight

আমি জিসিসি ৪.৮.১ ব্যবহার করছি এবং এটি মনে হয় না যে কনস্টেবল ভেরিয়েবল স্থানীয় থেকে ডেটা বিভাগে মূখ্য রয়েছে। নীচে এই জাতীয় 3 টি প্রোগ্রামের জন্য কোড এবং মেমরি মানচিত্র রয়েছে: কোড 1: int প্রধান (শূন্য) {// চর a [10] = "হেলো"; // 1 // const char a [10] = "হেলো"; // 2 রিটার্ন 0; AB উপরের জন্য মেমরি ম্যাপ: পাঠ্য ডেটা বিএস ডেস হেক্স ফাইলের নাম 7264 1688 1040 9992 2708 a.exe মেমোরি ম্যাপ 2 এর জন্য: পাঠ্য ডেটা বিএস ডেস হেক্স ফাইলের নাম 7280 1688 1040 10008 2718 a.exe মেমোরি ম্যাপ 3 এর জন্য: টেক্সট ডেটা বিএস ডেস হেক্স ফাইলের নাম 7280 1688 1040 10008 2718 a.exe
Mahori

124

সেই ভবিষ্যতের দর্শকদের জন্য যারা সেই মেমরি বিভাগগুলি সম্পর্কে জানতে আগ্রহী হতে পারেন, আমি সিতে প্রায় 5 টি মেমরি বিভাগে গুরুত্বপূর্ণ পয়েন্ট লিখছি:

কিছু মাথা আপ:

  1. যখনই কোনও সি প্রোগ্রাম কার্যকর করা হয় তখন প্রোগ্রামটি কার্যকর করার জন্য কিছু মেমরি র‌্যামে বরাদ্দ করা হয়। এই মেমরিটি প্রায়শই সম্পাদিত কোড (বাইনারি ডেটা), প্রোগ্রাম ভেরিয়েবলগুলি সংরক্ষণ করার জন্য ব্যবহৃত হয় below নীচের মেমরি বিভাগগুলি এ সম্পর্কে আলোচনা করে:
  2. সাধারণত তিন ধরণের ভেরিয়েবল রয়েছে:
    • স্থানীয় ভেরিয়েবল (সিতে স্বয়ংক্রিয় চলক হিসাবেও পরিচিত)
    • গ্লোবাল ভেরিয়েবল
    • স্ট্যাটিক ভেরিয়েবল
    • আপনার কাছে গ্লোবাল স্ট্যাটিক বা স্থানীয় স্ট্যাটিক ভেরিয়েবল থাকতে পারে তবে উপরের তিনটি প্যারেন্ট টাইপের।

সি তে 5 মেমরি বিভাগ:

1. কোড বিভাগ

  • কোড বিভাগটি, পাঠ্য বিভাগ হিসাবেও উল্লেখ করা হয়, এটি মেমরির ক্ষেত্র যা প্রায়শই সম্পাদিত কোড থাকে।
  • কোড বিভাগটি প্রায়শই পঠনযোগ্য কেবল বাফার-ওভারফ্লো ইত্যাদির মতো প্রোগ্রামিং বাগের মাধ্যমে ওভাররাইড হওয়ার ঝুঁকি এড়াতে is
  • কোড সেগমেন্টে স্থানীয় ভেরিয়েবল ( সি তে স্বয়ংক্রিয় ভেরিয়েবল নামে পরিচিত ), গ্লোবাল ভেরিয়েবল ইত্যাদির মতো প্রোগ্রাম ভেরিয়েবল থাকে না
  • সি প্রয়োগের উপর ভিত্তি করে, কোড বিভাগে কেবল পঠনযোগ্য স্ট্রিং লিটারেল থাকতে পারে। উদাহরণস্বরূপ, আপনি যখন printf("Hello, world")স্ট্রিং করেন তখন "হ্যালো, ওয়ার্ল্ড" কোড / পাঠ্য বিভাগে তৈরি হয়। আপনি sizeলিনাক্স ওএসে কমান্ডটি ব্যবহার করে এটি যাচাই করতে পারেন ।
  • আরও পড়া

ডেটা বিভাগ

ডেটা বিভাগটি নীচের দুটি অংশে বিভক্ত এবং সাধারণত গাদা ক্ষেত্রের নীচে বা স্ট্যাকের উপরে কিছু বাস্তবায়নে থাকে তবে ডেটা বিভাগটি কখনই গাদা এবং স্ট্যাকের জায়গার মধ্যে থাকে না।

২. অবিশ্রুত ডেটা বিভাগ

  • এই বিভাগটি বিএসএস নামেও পরিচিত ।
  • এটি মেমরির অংশ যা এতে রয়েছে:
    1. একীকরণবিহীন গ্লোবাল ভেরিয়েবল (পয়েন্টার ভেরিয়েবল সহ)
    2. একীকরণবিহীন ধ্রুবক গ্লোবাল ভেরিয়েবল
    3. অবিচ্ছিন্ন স্থানীয় স্ট্যাটিক ভেরিয়েবল
  • কোনও বৈশ্বিক বা স্থিতিশীল স্থানীয় ভেরিয়েবল যা আরম্ভ করা হয়নি তা অবিবেচনাযুক্ত ডেটা বিভাগে সংরক্ষণ করা হবে
  • উদাহরণস্বরূপ: গ্লোবাল ভেরিয়েবল int globalVar;বা স্ট্যাটিক লোকাল ভেরিয়েবল static int localStatic;অবিবেচনাযুক্ত ডেটা বিভাগে সংরক্ষণ করা হবে।
  • আপনি যদি কোনও বৈশ্বিক পরিবর্তনশীল ঘোষণা করেন এবং এটি হিসাবে 0বা NULLতারপরেও আরম্ভ করেন তবে এটি অবিবেচনাযুক্ত ডেটা বিভাগ বা বিএসএসে যাবে।
  • আরও পড়া

৩. প্রাথমিকভাবে ডেটা বিভাগ

  • এই বিভাগটি স্টোর:
    1. প্রাথমিক গ্লোবাল ভেরিয়েবল (পয়েন্টার ভেরিয়েবল সহ)
    2. শুরু করা ধ্রুবক গ্লোবাল ভেরিয়েবলগুলি
    3. স্থানীয় স্ট্যাটিক ভেরিয়েবলের সূচনা
  • উদাহরণস্বরূপ: গ্লোবাল ভেরিয়েবল int globalVar = 1;বা স্ট্যাটিক লোকাল ভেরিয়েবল static int localStatic = 1;প্রারম্ভিক ডেটা বিভাগে সংরক্ষণ করা হবে।
  • এই বিভাগটি আরও প্রাথমিকভাবে কেবল পঠনযোগ্য অঞ্চলে শ্রেণিবদ্ধ করা যেতে পারে এবং পঠন-পাঠের ক্ষেত্রে আরম্ভ করা যায়প্রারম্ভিক ধ্রুবক গ্লোবাল ভেরিয়েবলগুলি প্রাথমিক পঠনযোগ্য অঞ্চলে যাবে যখন ভেরিয়েবলগুলির মানগুলি রানটাইমগুলিতে সংশোধন করা যেতে পারে সেগুলি প্রারম্ভিক পাঠ্য-লেখার ক্ষেত্রে যাবে
  • এই বিভাগটির আকার প্রোগ্রামের উত্স কোডের মানগুলির আকার দ্বারা নির্ধারিত হয় এবং রান সময় পরিবর্তন হয় না
  • আরও পড়া

স্ট্যাক সেগমেন্ট

  • স্ট্যাক সেগমেন্টটি ভেরিয়েবলগুলি সংরক্ষণ করতে ব্যবহৃত হয় যা ফাংশনের অভ্যন্তরে তৈরি হয় ( ফাংশন মূল ফাংশন বা ব্যবহারকারী-সংজ্ঞায়িত ফাংশন হতে পারে ), ভেরিয়েবলের মতো
    1. ফাংশনের স্থানীয় ভেরিয়েবল (পয়েন্টার ভেরিয়েবল সহ)
    2. যুক্তিগুলি কার্যক্রমে পাস হয়েছে
    3. ফেরত ঠিকানা
  • স্ট্যাকের মধ্যে সঞ্চিত ভেরিয়েবলগুলি কার্য সম্পাদন শেষ হওয়ার সাথে সাথে সরানো হবে।
  • আরও পড়া

5. গাদা অংশ

  • এই বিভাগটি গতিশীল মেমরি বরাদ্দ সমর্থন করে। প্রোগ্রামার সি পরিবর্তনশীল তারপর কিছু মেমরি বরাদ্দ করতে চায় এটি ব্যবহার করা হয় malloc, callocঅথবা reallocপদ্ধতি।
  • উদাহরণস্বরূপ, int* prt = malloc(sizeof(int) * 2)তারপরে যখন আটটি বাইটগুলি হ্যাপে বরাদ্দ করা হবে এবং সেই অবস্থানের মেমরি ঠিকানা ফিরে আসবে এবং ptrভেরিয়েবলের মধ্যে সংরক্ষণ করা হবে । ptrপরিবর্তনশীল উভয় ক্ষেত্রেই এই ছবিটিকে / ব্যবহার করা হয় তার উপর নির্ভর করে স্ট্যাকের বা তথ্য সেগমেন্ট হতে হবে।
  • আরও পড়া

এটি 3 টি অবিচ্ছিন্ন করার পরিবর্তে আরম্ভ করা উচিত নয় Initial
সুরজ জৈন

পুনরায় "অবিশ্রুত ডেটা বিভাগে সঞ্চিত" (একাধিক উদাহরণ): আপনি "ডেটা বিভাগে অবিচ্ছিন্ন সংরক্ষিত" বলতে চান ?
পিটার মর্টেনসেন

@ পিটারমোরটেনসেন "যে কোনও বৈশ্বিক বা স্থিতিশীল স্থানীয় ভেরিয়েবল যা আরম্ভ করা হয় না তা অবিচ্ছিন্ন তথ্য বিভাগে সংরক্ষণ করা হবে"
হাগারওয়াল

সি-তে কীভাবে আমরা বিশ্বব্যাপী স্থির পরিবর্তনশীল থাকতে পারি?

"কিছু মাথা আপ" এর অধীনে, আমি এই পয়েন্টটি পেয়েছি "আপনার কাছে বৈশ্বিক স্ট্যাটিক বা স্থানীয় স্ট্যাটিক ভেরিয়েবল থাকতে পারে তবে উপরের তিনটি প্যারেন্ট টাইপের are" যার মধ্যে আপনি "গ্লোবাল স্ট্যাটিক" শব্দটি উল্লেখ করেছেন। আমার বক্তব্য একটি স্থির পরিবর্তনশীল বিশ্বব্যাপী হতে পারে না। অর্থাত্, যদি কোনও পরিবর্তনশীল বিশ্বব্যাপী হতে হয় তবে প্রোগ্রামটির সম্পাদনা সম্পূর্ণ না হওয়া পর্যন্ত এটি অ্যাক্সেসযোগ্য হওয়া উচিত। আমি ভুল হলে দয়া করে ব্যাখ্যা করুন এবং সহায়তা করুন।

11

আপনার ভুল বাক্য সংশোধন করেছেন

constant data types ----->  code //wrong

স্থানীয় ধ্রুবক পরিবর্তনশীল -----> স্ট্যাক

সূচনা বিশ্বব্যাপী ধ্রুব পরিবর্তনশীল -----> ডেটা বিভাগ

অবিচ্ছিন্ন গ্লোবাল ধ্রুব পরিবর্তনশীল -----> বিএসএস

variables declared and defined in main function  ----->  heap //wrong

ভেরিয়েবলগুলি মূল ফাংশন -----> স্ট্যাকে ঘোষণা এবং সংজ্ঞায়িত

pointers(ex:char *arr,int *arr) ------->  heap //wrong

dynamically allocated space(using malloc,calloc) --------> stack //wrong

পয়েন্টার (উদা: চর * আরআর, ইন্টি * আরআর) -------> যে পয়েন্টার ভেরিয়েবলের আকার স্ট্যাকের মধ্যে থাকবে।

বিবেচনা করুন যে আপনি এন বাইটসের মেমরি বরাদ্দ করছেন (ব্যবহার mallocবা calloc) গতিশীল এবং তারপরে এটি নির্দেশ করতে পয়েন্টার ভেরিয়েবল তৈরি করছে। এখন যে nমেমরির বাইটগুলি হিপ এবং পয়েন্টার ভেরিয়েবলের পুনরুদ্ধারগুলি 4 বাইট (যদি 64 বিট মেশিন 8 বাইট) থাকে যা nমেমরির খণ্ডের বাইটগুলির প্রারম্ভিক পয়েন্টারটি সঞ্চয় করতে স্ট্যাকের মধ্যে থাকবে ।

দ্রষ্টব্য: পয়েন্টার ভেরিয়েবলগুলি যে কোনও বিভাগের মেমরিটিকে নির্দেশ করতে পারে।

int x = 10;
void func()
{
int a = 0;
int *p = &a: //Now its pointing the memory of stack
int *p2 = &x; //Now its pointing the memory of data segment
chat *name = "ashok" //Now its pointing the constant string literal 
                     //which is actually present in text segment.
char *name2 = malloc(10); //Now its pointing memory in heap
...
}

গতিশীলভাবে বরাদ্দ স্থান (malloc, কলোক ব্যবহার করে) --------> হিপ


পয়েন্টারগুলি স্ট্যাক বা হিপ উভয় হতে পারে (বিশেষত: পয়েন্টারগুলিতে পয়েন্টার দেখুন)
আর্জেণ্টেজ

@ আইয়ারজা: এখন আপডেট হয়েছে। অ্যাক্টলি আমি কেবল সেই বিবরণটি আপডেট করেছিলাম :)
রাশোক

নিম্নলিখিত মেমরি মানচিত্রে, আপনি দয়া করে চিহ্নিত করতে পারেন কোথায় স্ট্যাক এবং গাদা আছে? আমি নিশ্চিত নই যে এটি স্ট্যাক এবং মেমরির সঠিক প্রশ্নটি কেবল রান টাইমে প্রযোজ্য। মেমরি মানচিত্র: "ডিসেম্বর হেক্স ফাইলের নাম বাসস 7280 1688 1040 10008 2718 a.exe টেক্সট ডেটা"
Mahori

7

একটি জনপ্রিয় ডেস্কটপ আর্কিটেকচার বিভিন্ন বিভাগে প্রক্রিয়াটির ভার্চুয়াল মেমরি ভাগ করে দেয় :

  • পাঠ্য বিভাগ: সম্পাদনযোগ্য কোড রয়েছে code নির্দেশ পয়েন্টারটি এই ব্যাপ্তিতে মান গ্রহণ করে।

  • ডেটা বিভাগ: গ্লোবাল ভেরিয়েবল (অর্থাত্ স্ট্যাটিক লিঙ্কেজ সহ বস্তু) রয়েছে। কেবলমাত্র পঠনযোগ্য ডেটাতে (যেমন স্ট্রিং ধ্রুবক হিসাবে) এবং অবিশ্রুত ডেটা ("বিএসএস") তে বিভক্ত।

  • স্ট্যাক সেগমেন্ট: প্রোগ্রামটির জন্য ডায়নামিক মেমরি, যেমন ফ্রি স্টোর ("হিপ") এবং সমস্ত থ্রেডের জন্য স্থানীয় স্ট্যাক ফ্রেম রয়েছে। Ditionতিহ্যগতভাবে সি স্ট্যাক এবং সি হিপগুলি বিপরীত প্রান্ত থেকে স্ট্যাক সেগমেন্টে বাড়ত, তবে আমি বিশ্বাস করি যে অনুশীলনটি তাত্পর্যপূর্ণ করা হয়েছে কারণ এটি খুব নিরাপদ নয়।

এসি প্রোগ্রাম সাধারণত স্ট্যাটিক স্টোরেজ সময়কাল সহ অবজেক্টগুলিকে ডেটা সেগমেন্টে রাখে, ফ্রি স্টোরে গতিশীলভাবে বরাদ্দকৃত অবজেক্ট এবং থ্রেডের কল স্ট্যাকের মধ্যে স্বয়ংক্রিয় অবজেক্ট যেখানে এটি বাস করে।

অন্যান্য প্ল্যাটফর্মগুলিতে, যেমন পুরানো x86 রিয়েল মোডে বা এম্বেড থাকা ডিভাইসে, জিনিসগুলি স্পষ্টতই আলাদা হতে পারে।


"আমি বিশ্বাস করি যে অনুশীলনটি খুব অনিরাপদ কারণ এটিকে পরিত্যাগ করা হয়েছে" - এবং থ্রেডগুলি বাস্তবায়ন করা অসম্ভব করে তোলে, তখন থেকে আপনার প্রতি প্রোগ্রামে একাধিক স্ট্যাক প্রয়োজন এবং সেগুলি সব শেষে হতে পারে না :-)
স্টিভ জেসোপ

@ স্টিভ জেসাপ: হ্যাঁ, আমিও এটি ভাবছিলাম। তবে থ্রেডগুলি দীর্ঘকাল ধরে বিদ্যমান রয়েছে - আমি জানি না যে সমস্ত থ্রেড স্ট্যাকগুলিও পিছনের দিকে বেড়েছে, বা যদি সেগুলি স্তূপের মতো বড় হয় তবে ... আজকাল সবকিছু একই দিকে চলে এবং সেখানে প্রহরী রয়েছে পেজ।
কেরেক এসবি

6

আমি কেবলমাত্র সি দৃষ্টিকোণ থেকে এই পরিবর্তনগুলি উল্লেখ করছি।

সি ভাষার দৃষ্টিকোণ থেকে , সমস্ত কিছু হ'ল ব্যাপ্তি, সুযোগ, সংযোগ এবং অ্যাক্সেস; ঠিক কীভাবে আইটেমগুলি বিভিন্ন মেমরি বিভাগে ম্যাপ করা হয় তা পৃথক বাস্তবায়নের উপর নির্ভর করে এবং এটি পৃথক হবে। সেই ভাষাটি কি প্রমিত মেমরির অংশ সম্পর্কে কথা বলতে না এ সব । বেশিরভাগ আধুনিক স্থাপত্যগুলি বেশিরভাগ একইভাবে কাজ করে; ব্লক-স্কোপ ভেরিয়েবল এবং ফাংশন আর্গুমেন্টগুলি স্ট্যাক থেকে বরাদ্দ করা হবে, ফাইল-স্কোপ এবং স্ট্যাটিক ভেরিয়েবলগুলি কোনও ডেটা বা কোড বিভাগ থেকে বরাদ্দ করা হবে, গতিশীল মেমরিটি একটি গাদা থেকে বরাদ্দ করা হবে, কিছু ধ্রুবক ডেটা কেবল পঠনযোগ্য বিভাগগুলিতে সংরক্ষণ করা হবে ইত্যাদি


3

একটা জিনিষ এক মনে রাখা স্টোরেজ সম্পর্কে দরকার যেমন-যদি নিয়ম । কম্পাইলার কোনো নির্দিষ্ট স্থানের একটি পরিবর্তনশীল করা প্রয়োজন হয় না - পরিবর্তে এটা স্থাপন করতে পারেন যেখানেই থাকুন না কেন এটা যতদিন কম্পাইল প্রোগ্রাম আচরণ করবে হিসাবে pleases হিসাবে যদি এটি বিমূর্ত সি মেশিনে বিমূর্ত সি মেশিনের নিয়ম অনুযায়ী চালানো হয়। এটি সমস্ত স্টোরেজ সময়কালের জন্য প্রযোজ্য । উদাহরণ স্বরূপ:

  • একটি ভেরিয়েবল যা অ্যাক্সেস করা হয় না তা সম্পূর্ণরূপে মুছে ফেলা যায় - এর কোনও সঞ্চয়স্থান নেই ... কোথাও নেই। উদাহরণ - দেখুন 42উত্পন্ন সমাবেশে কীভাবে আছে তবে কোনও চিহ্ন নেই 404
  • স্বয়ংক্রিয় স্টোরেজ সময়কাল সহ একটি পরিবর্তনশীল যার ঠিকানা নেওয়া নেই এটি মোটেও মেমরিতে সঞ্চয় করার প্রয়োজন নেই। একটি উদাহরণ একটি লুপ পরিবর্তনশীল হবে।
  • একটি পরিবর্তনশীল যা constকার্যকরভাবে constমেমোরিতে থাকা উচিত নয়। উদাহরণ - সংকলক fooকার্যকরভাবে প্রমাণ করতে পারে constএবং কোডের সাথে এর ব্যবহারকে ইনলাইন করে। barবাহ্যিক লিঙ্কেজ রয়েছে এবং সংকলক প্রমাণ করতে পারে না যে এটি বর্তমান মডিউলের বাইরে পরিবর্তন করা হবে না, তাই এটি ইনলাইনড নয়।
  • mallocপ্রয়োজনযুক্ত বরাদ্দকৃত কোনও বস্তু গাদা থেকে বরাদ্দ মেমরির মধ্যে থাকতে পারে না! উদাহরণ - লক্ষ্য করুন কীভাবে কোডটির কোনও কল নেই mallocএবং মানও 42 টি মেমরির মধ্যে কখনও সংরক্ষণ করা হয় না, এটি একটি রেজিস্টারে রাখা হয়!
  • সুতরাং এমন একটি বস্তু যা বরাদ্দ করা হয়েছে mallocএবং রেফারেন্সটি হারিয়ে ফেলবে স্মৃতিটি ফাঁস করার free দরকার নেই এমন অবজেক্টটিকে অবহেলা না করে ...
  • mallocপ্রয়োজন অনুসারে বরাদ্দ করা বস্তুটি ইউনিক্সেনে প্রোগ্রাম বিরতি ( ) এর নীচে the sbrk(0)েকে রাখা উচিত নয় ...

1

পয়েন্টার (উদা: চর * আরআর, ইন্টি * আরআর) -------> হিপ

না, তারা স্ট্যাকের মধ্যে বা ডেটা বিভাগে থাকতে পারে। তারা যে কোনও জায়গায় ইঙ্গিত করতে পারে।


mainপরিবর্তনশীল এবং বরাদ্দকৃত ভেরিয়েবলগুলি সম্পর্কে বিবৃতিগুলিও ভুল
সাইমনক

কেবল স্ট্যাক বা ডেটা বিভাগে নয়। একটি পয়েন্টার সম্পর্কে চিন্তা করুন যা পয়েন্টারগুলির একটি অ্যারে নির্দেশ করে। এই ক্ষেত্রে অ্যারের পয়েন্টারগুলি হিপে সংরক্ষণ করা হয়।
Sebi2020

1
  • পরিবর্তনশীল / স্বয়ংক্রিয় ভেরিয়েবল ---> স্ট্যাক বিভাগ
  • গতিশীলভাবে বরাদ্দ করা চলক ---> হিপ বিভাগ section
  • সূচিত বৈশ্বিক পরিবর্তনশীল -> ডেটা বিভাগ
  • একীকরণবিহীন গ্লোবাল ভেরিয়েবল -> ডেটা বিভাগ (বিএসএস)
  • স্ট্যাটিক ভেরিয়েবল -> ডেটা বিভাগ
  • স্ট্রিং ধ্রুবক -> পাঠ্য বিভাগ / কোড বিভাগ
  • ফাংশন -> পাঠ্য বিভাগ / কোড বিভাগ
  • পাঠ্য কোড -> পাঠ্য বিভাগ / কোড বিভাগ
  • নিবন্ধসমূহ -> সিপিইউ নিবন্ধন করুন
  • কমান্ড লাইন ইনপুট -> পরিবেশগত / কমান্ড লাইন বিভাগ
  • পরিবেশগত পরিবর্তনশীল -> পরিবেশগত / কমান্ড লাইন বিভাগ

পরিবেশ / কমান্ড লাইন বিভাগ কি? এগুলি কি লিনাক্সে বিদ্যমান?
হাওয়ুয়ান Ge

-1

অপ্রয়োজনীয় বিশ্লেষণ সহ লিনাক্স ন্যূনতম চলমান উদাহরণ

যেহেতু এটি একটি বাস্তবায়নের বিশদটি মান দ্বারা নির্দিষ্ট নয়, তাই আসুন কেবল একটি বিশেষ প্রয়োগের ক্ষেত্রে সংকলকটি কী করছে তা একবার দেখে নেওয়া যাক।

এই উত্তরে, আমি হয় সুনির্দিষ্ট উত্তরের সাথে লিঙ্ক করব যা বিশ্লেষণ করে, বা বিশ্লেষণ সরাসরি এখানে সরবরাহ করে এবং এখানে সমস্ত ফলাফল সংক্ষিপ্ত করে রাখি।

এগুলির সমস্তগুলি বিভিন্ন উবুন্টু / জিসিসি সংস্করণে রয়েছে এবং ফলাফলগুলি সম্ভবত সংস্করণগুলিতে বেশ স্থিতিশীল, তবে আমরা যদি কোনও প্রকারের সন্ধান পাই তবে আসুন আমরা আরও সুনির্দিষ্ট সংস্করণগুলি নির্দিষ্ট করি।

একটি ফাংশনের ভিতরে স্থানীয় পরিবর্তনশীল vari

সে হোক mainবা অন্য যে কোনও ফাংশন:

void f(void) {
    int my_local_var;
}

যেমন দেখানো হয়েছে: জিডিবিতে <মান অপ্টিমাইজড> এর অর্থ কী?

  • -O0: স্ট্যাক
  • -O3: নিবন্ধন যদি তারা স্পিল না করে, অন্যথায় স্ট্যাক করুন

স্ট্যাকটি কেন বিদ্যমান তা অনুপ্রেরণার জন্য: x86 অ্যাসেমব্লিতে রেজিস্টারগুলিতে ব্যবহৃত পুশ / পপ নির্দেশাবলীর কাজ কী?

গ্লোবাল ভেরিয়েবল এবং staticফাংশন ভেরিয়েবল

/* BSS */
int my_global_implicit;
int my_global_implicit_explicit_0 = 0;

/* DATA */
int my_global_implicit_explicit_1 = 1;

void f(void) {
    /* BSS */
    static int my_static_local_var_implicit;
    static int my_static_local_var_explicit_0 = 0;

    /* DATA */
    static int my_static_local_var_explicit_1 = 1;
}
  • যদি আরম্ভ হয় 0বা না হয় (আর তাই সুস্পষ্টভাবে আরম্ভ করা হয় 0): .bssবিভাগে, আরও দেখুন: .bss বিভাগটি কেন প্রয়োজন?
  • অন্যথায়: .dataবিভাগ

char * এবং char c[]

যেমন দেখানো হয়েছে: সি এবং সি ++ এ স্ট্যাটিক ভেরিয়েবলগুলি কোথায় রয়েছে?

void f(void) {
    /* RODATA / TEXT */
    char *a = "abc";

    /* Stack. */
    char b[] = "abc";
    char c[] = {'a', 'b', 'c', '\0'};
}

টোডো কি খুব বড় স্ট্রিং লিটারেলগুলি স্ট্যাকের উপরে রাখা হবে? নাকি .data? বা সংকলন ব্যর্থ হয়?

ফাংশন যুক্তি

void f(int i, int j);

প্রাসঙ্গিক কলিং কনভেনশনটি অবশ্যই যেতে হবে, যেমন: এক্স ৮86 এর জন্য https://en.wikedia.org/wiki/X86_calling_conventions , যা প্রতিটি ভেরিয়েবলের জন্য নির্দিষ্ট রেজিস্টার বা স্ট্যাকের অবস্থান নির্দিষ্ট করে।

তারপরে জিডিবিতে <মান অপ্টিমাইজড> এর অর্থ কী? , -O0তারপরে স্ট্যাকের মধ্যে সমস্ত কিছু স্লਪਰ্পস করে, -O3যতটা সম্ভব রেজিস্টারগুলি ব্যবহার করার চেষ্টা করে।

যদি ফাংশনটি অন্তর্ভুক্ত হয় তবে তাদের নিয়মিত স্থানীয়দের মতোই চিকিত্সা করা হবে।

const

আমি বিশ্বাস করি যে এটি কোনও পার্থক্য করে না কারণ আপনি এটিকে দূরে টাইপকাস্ট করতে পারেন।

বিপরীতভাবে, যদি সংকলকটি নির্ধারণ করতে সক্ষম হয় যে কিছু ডেটা কখনও লিখিত হয় না, তবে এটি তাত্ত্বিকভাবে এটি স্থাপন করতে .rodataপারে তবে কনস্ট নাও।

টোডো বিশ্লেষণ।

পয়েন্টার

এগুলি ভেরিয়েবল (এতে অ্যাড্রেস রয়েছে, যা সংখ্যা রয়েছে), তবে বাকি সমস্তগুলির মতো :-)

যদি malloc

প্রশ্নটি mallocযেহেতু mallocকোনও ফাংশন, এবং এর জন্য: তেমন কোনও অর্থবোধ করে না:

int *i = malloc(sizeof(int));

*i একটি পরিবর্তনশীল যা একটি ঠিকানা রয়েছে, সুতরাং এটি উপরের ক্ষেত্রে পড়ে।

অভ্যন্তরীণভাবে মলোক কীভাবে কাজ করে আপনি যখন লিনাক্স কার্নেলটি তার অভ্যন্তরীণ ডেটা স্ট্রাকচারগুলিতে নির্দিষ্ট ঠিকানাগুলি লিখনযোগ্য হিসাবে চিহ্নিত করেন এবং যখন প্রাথমিকভাবে তারা প্রোগ্রামটি স্পর্শ করেন, ত্রুটি ঘটে এবং কার্নেল পৃষ্ঠার সারণিগুলিকে সক্ষম করে, যা অ্যাক্সেস করতে দেয় সেগফুল ছাড়াই ঘটে: x86 পেজিং কীভাবে কাজ করে?

তবে খেয়াল করুন যে execআপনি যখন এক্সিকিউটেবল চালনার চেষ্টা করেন তখন সিস্কলটি হুডের নীচে ঠিক কী ঘটে: এটি যে পৃষ্ঠাগুলিতে লোড করতে চায় তা চিহ্নিত করে এবং সেখানে প্রোগ্রামটি লেখেন, এটিও দেখুন: কার্নেল কীভাবে এক্সিকিউটেবল বাইনারি ফাইলটি চলমান তা পেতে পারে? লিনাক্স? execকোথায় লোড করতে হবে তার উপর কিছু অতিরিক্ত সীমাবদ্ধতা ব্যতীত (যেমন কোডটি স্থানান্তরযোগ্য নয় )।

সঠিক ব্যবহার করা প্রাপ্ত syscall mallocহয় mmapআধুনিক 2020 বাস্তবায়নের, এবং অতীতে brkব্যবহার করা হয়েছে: নেই যদি malloc () ব্যবহার brk () বা mmap ()?

ডায়নামিক লাইব্রেরি

মূলত mmapমেমরিতে এড করুন: /unix/226524/ কি- সিস্টেমে-call-is- used-to- load-libraries-in-linux/462710# 462710

এনভাইন্রোমেন্ট ভেরিয়েবল এবং mainএরargv

প্রাথমিক স্ট্যাকের উপরে: /unix/75939/ कहीं-is-the-en वातावरण- স্ট্রিং- অ্যাক্টুয়াল-স্টোরড টোডো কেন .ডাটাতে নেই?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.