প্রথমটির চেয়ে ভয়াবহ বলে মনে হচ্ছে এমন কিছুর পরে, প্রাথমিক ভয়টি কাটিয়ে ওঠার সর্বোত্তম উপায় হ'ল নিজেকে অজানাটির অস্বস্তিতে ডুবিয়ে দেওয়া ! এটি এমন সময়ে হয় যা আমরা সবচেয়ে বেশি শিখি, সর্বোপরি।
দুর্ভাগ্যক্রমে, সীমাবদ্ধতা আছে। আপনি এখনও কোনও ফাংশন ব্যবহার করতে শিখতে গিয়ে উদাহরণস্বরূপ আপনার কোনও শিক্ষকের ভূমিকা গ্রহণ করা উচিত নয়। আমি প্রায়শই তাদের উত্তরগুলি পড়ি যা সম্ভবত আপাতদৃষ্টিতে ব্যবহার করতে হয় না realloc
(যেমন বর্তমানে গৃহীত উত্তর! ) অন্যকে কীভাবে ভুলভাবে ব্যবহার করতে হবে তা বলার জন্য, মাঝে মাঝে এই ত্রুটির আওতায় যে তারা ত্রুটি পরিচালনা করা বাদ দিয়েছে , যদিও এটি একটি সাধারণ সমস্যা যার উল্লেখ দরকার। সঠিকভাবে কীভাবে ব্যবহার করবেন সে সম্পর্কে এখানে একটি উত্তর দেওয়া আছেrealloc
। লক্ষ্য করুন যে উত্তরটি ত্রুটি পরীক্ষা করার জন্য ফেরত মানটিকে একটি ভিন্ন ভেরিয়েবলে সংরক্ষণ করছে ।
আপনি যখনই কোনও ফাংশন কল করবেন এবং প্রতিবার আপনি কোনও অ্যারে ব্যবহার করবেন তখন আপনি পয়েন্টার ব্যবহার করছেন। রূপান্তরগুলি স্পষ্টতই ঘটছে, যা যদি কিছু এমনকি ভয়ঙ্কর হয় তবে এটি এমন জিনিস যা আমরা দেখি না যা প্রায়শই সর্বাধিক সমস্যার কারণ হয়ে থাকে। উদাহরণস্বরূপ, মেমরি ফাঁস ...
অ্যারে অপারেটরগুলি পয়েন্টার অপারেটর। array[x]
সত্যিই এটির জন্য একটি শর্টকাট *(array + x)
, যা এটিকে ভেঙে ফেলা যেতে পারে: *
এবং (array + x)
। সম্ভবত *
এটিই আপনাকে বিভ্রান্ত করে। সমস্যাটিকে যুক্ত করে ধরে x
নিয়ে আমরা আরও সমস্যাটিকে আরও দূর করতে পারি 0
, সুতরাং, array[0]
হয়ে যায় *array
কারণ যুক্ত করা 0
মান পরিবর্তন করে না ...
... এবং এইভাবে আমরা দেখতে পাচ্ছি যে *array
এটি সমান array[0]
। আপনি যেখানে অন্যটি ব্যবহার করতে চান সেখানে একটি ব্যবহার করতে পারেন এবং বিপরীতে। অ্যারে অপারেটরগুলি পয়েন্টার অপারেটর।
malloc
, realloc
এবং বন্ধুরা কোনও পয়েন্টারের ধারণাটি আবিষ্কার করে না যা আপনি সবগুলি ব্যবহার করছেন; তারা নিছক ব্যবহার অন্য কিছু বৈশিষ্ট্য, যা স্টোরেজ সময়কাল একটি ভিন্ন রূপ, সবচেয়ে উপযুক্ত যখন আপনি ইচ্ছা বাস্তবায়নের জন্য এই মাপের প্রচণ্ড, ডায়নামিক পরিবর্তন ।
এটা একটা লজ্জা হয় যে বর্তমানে গৃহীত উত্তর এছাড়াও শস্য পরিপন্থী Stackoverflow কিছু অন্যান্য খুব সুপ্রতিষ্ঠিত পরামর্শ , এবং একই সময়ে, একটু পরিচিত বৈশিষ্ট্য যা ঠিক এই usecase জন্য shines পরিচয় করিয়ে দিতে একটি সুযোগ ব্যার্থ: নমনীয় অ্যারে সদস্যদের! এটি আসলে বেশ ভাঙা উত্তর ... :(
আপনি যখন আপনার সংজ্ঞা দেন, কাঠামোর শেষেstruct
আপনার অ্যারেটি কোনও উচ্চতর সীমা ছাড়াই ঘোষণা করুন । উদাহরণ স্বরূপ:
struct int_list {
size_t size;
int value[];
};
এটি আপনাকে আপনার int
হিসাবে একই বরাদ্দে আপনার অ্যারে একত্রিত করার অনুমতি দেবে count
এবং এগুলি এ জাতীয়ভাবে আবদ্ধ করা খুব সহজ হতে পারে !
sizeof (struct int_list)
এর value
আকার 0 এর আকারের মতোই কাজ করবে , সুতরাং এটি আপনাকে খালি তালিকা সহ কাঠামোর আকার জানাবে । realloc
আপনার তালিকার আকার নির্দিষ্ট করতে আপনাকে এখনও পাস করা আকারে যুক্ত করতে হবে ।
আর একটি সহজ টিপ হ'ল realloc(NULL, x)
এটি সমান malloc(x)
এবং এটি আমাদের কোডটি সহজ করার জন্য ব্যবহার করতে পারি। উদাহরণ স্বরূপ:
int push_back(struct int_list **fubar, int value) {
size_t x = *fubar ? fubar[0]->size : 0
, y = x + 1;
if ((x & y) == 0) {
void *temp = realloc(*fubar, sizeof **fubar
+ (x + y) * sizeof fubar[0]->value[0]);
if (!temp) { return 1; }
*fubar = temp; // or, if you like, `fubar[0] = temp;`
}
fubar[0]->value[x] = value;
fubar[0]->size = y;
return 0;
}
struct int_list *array = NULL;
struct int_list **
প্রথম যুক্তি হিসাবে আমি যে কারণটি বেছে নিয়েছি তা তাত্ক্ষণিকভাবে সুস্পষ্ট বলে মনে হচ্ছে না, তবে আপনি যদি দ্বিতীয় যুক্তির কথা চিন্তা করেন, তবে value
ভিতরে থেকে যে কোনও পরিবর্তন হয়েছে push_back
তা আমরা যে ফাংশন থেকে ডেকে আছি তা দৃশ্যমান হবে না, তাই না? প্রথম তর্কটির ক্ষেত্রেও এটি একইভাবে ঘটে এবং আমাদের array
কেবলমাত্র এখানেই নয়, সম্ভবত অন্য কোনও ক্রিয়াকলাপেও আমরা এটি সংশোধন করতে পারি ...
array
কিছুই দেখানো শুরু; এটি একটি খালি তালিকা। এটি আরম্ভ করার সাথে এটি যোগ করার মতোই। উদাহরণ স্বরূপ:
struct int_list *array = NULL;
if (!push_back(&array, 42)) {
// success!
}
পিএস আপনার সাথে এটি শেষ হয়ে গেলে মনে রাখবেনfree(array);
!