আমি জানি যে সমস্ত সি সংকলক প্রয়োগের পিছনে একটি মান আছে, তাই কোনও লুকানো বৈশিষ্ট্য থাকা উচিত। তবুও, আমি নিশ্চিত যে সমস্ত সি বিকাশকারীদের গোপন / গোপন কৌশলগুলি তারা সর্বদা ব্যবহার করে।
আমি জানি যে সমস্ত সি সংকলক প্রয়োগের পিছনে একটি মান আছে, তাই কোনও লুকানো বৈশিষ্ট্য থাকা উচিত। তবুও, আমি নিশ্চিত যে সমস্ত সি বিকাশকারীদের গোপন / গোপন কৌশলগুলি তারা সর্বদা ব্যবহার করে।
উত্তর:
ফাংশন পয়েন্টার। আপনি প্রয়োগের জন্য ফাংশন পয়েন্টারগুলির একটি সারণি ব্যবহার করতে পারেন, উদাহরণস্বরূপ, দ্রুত পরোক্ষ-থ্রেডযুক্ত কোড ইন্টারপ্রিটার (ফোরথ) বা বাইট-কোড প্রেরণকারী, বা ও-এর মতো ভার্চুয়াল পদ্ধতিগুলি অনুকরণ করতে।
তারপরে স্ট্যান্ডার্ড লাইব্রেরিতে লুকানো রত্ন রয়েছে যেমন qsort (), bsearch (), strpbrk (), strcspn () [দ্বিতীয়টি একটি strtok () প্রতিস্থাপন বাস্তবায়নের জন্য কার্যকর)।
সি এর একটি ভুল বৈশিষ্ট্য হ'ল স্বাক্ষরিত পাটিগণিত ওভারফ্লো হ'ল অপরিজ্ঞাত আচরণ (ইউবি)। সুতরাং যখনই আপনি এক্স + ওয়াইয়ের মতো কোনও অভিব্যক্তি দেখেন, উভয়ই স্বাক্ষরিত ইনটস হয়, এটি সম্ভবত সম্ভাব্যভাবে উপচে পড়ে এবং ইউবি হতে পারে।
জিসিসি সংকলকটির আরও কৌশল, তবে আপনি সংস্থাপকটিতে শাখা সূচক ইঙ্গিত দিতে পারেন (লিনাক্স কার্নেলের মধ্যে সাধারণ)
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
দেখুন: http://kerneltrap.org/node/4705
আমি এই সম্পর্কে যা পছন্দ করি তা হ'ল এটি কিছু ফাংশনে কিছুটা এক্সপ্রেশনও যোগ করে।
void foo(int arg)
{
if (unlikely(arg == 0)) {
do_this();
return;
}
do_that();
...
}
int8_t
int16_t
int32_t
uint8_t
uint16_t
uint32_t
এগুলি স্ট্যান্ডার্ডের একটি alচ্ছিক আইটেম, তবে এটি অবশ্যই একটি লুকানো বৈশিষ্ট্য হওয়া উচিত, কারণ লোকেরা প্রতিনিয়ত তাদের পুনরায় সংজ্ঞা দিচ্ছে। আমি যে কোড কোডটিতে কাজ করেছি (এবং এখনও করছি, তার জন্য) একাধিক পুনঃনির্ধারণ রয়েছে, সবগুলি আলাদা আলাদা সনাক্তকারী সহ। বেশিরভাগ সময় এটি প্রিপ্রেসেসর ম্যাক্রোগুলির সাথে থাকে:
#define INT16 short
#define INT32 long
ইত্যাদি। এটি আমার চুলগুলি টেনে আনতে চায়। কেবল ফ্রেইকিং স্ট্যান্ডার্ড পূর্ণসংখ্য টাইপডিফ ব্যবহার করুন!
কমা অপারেটরটি বহুল ব্যবহৃত হয় না। এটি অবশ্যই আপত্তিজনক হতে পারে তবে এটি খুব কার্যকরও হতে পারে। এই ব্যবহারটি সর্বাধিক সাধারণ:
for (int i=0; i<10; i++, doSomethingElse())
{
/* whatever */
}
তবে আপনি এই অপারেটরটি যে কোনও জায়গায় ব্যবহার করতে পারেন। পালন:
int j = (printf("Assigning variable j\n"), getValueFromSomewhere());
প্রতিটি বিবৃতি মূল্যায়ন করা হয়, তবে প্রকাশের মানটি সর্বশেষ বিবৃতিতে মূল্যায়ন করা হবে।
কাঠামো শূন্যে আরম্ভ করা হচ্ছে
struct mystruct a = {0};
এটি সমস্ত স্টাকচার উপাদানগুলিকে শূন্য করবে।
memset
/ calloc
করুন "সমস্ত বাইট শূন্য" (অর্থাত্ শারীরিক জিরো), যা প্রকৃতপক্ষে সমস্ত ধরণের জন্য সংজ্ঞায়িত নয়। যথাযথ যৌক্তিক শূন্য মান সহ সবকিছু{ 0 }
অন্তর্নির্মিত করার গ্যারান্টিযুক্ত । উদাহরণস্বরূপ, প্রদত্ত প্ল্যাটফর্মের নাল-মানটি হলেও পয়েন্টারগুলি তাদের যথাযথ নাল মানগুলি পাওয়ার জন্য গ্যারান্টিযুক্ত । 0xBAADFOOD
memset
( 0
দ্বিতীয় যুক্তি হিসাবে)। আপনি উত্স কোডে অবজেক্টটিতে (বা ) সূচনা / নির্ধারণ করার সময় আপনি যৌক্তিক শূন্য পাবেন । এই দুই ধরণের জিরো অগত্যা একই ফল দেয় না। পয়েন্টার সহ উদাহরণ হিসাবে। আপনি যখন কোনও পয়েন্টারে করেন, আপনি একটি পয়েন্টার পান। তবে আপনি যখন কোনও পয়েন্টারকে অর্পণ করেন, আপনি নাল পয়েন্টার মান পাবেন যা শারীরিক স্তরে বা অন্য যে কোনও কিছু হতে পারে । 0
{ 0 }
memset
0x0000
0
0xBAADF00D
double
,। সাধারণত এটি আইইইই -754 স্ট্যান্ডার্ড অনুযায়ী বাস্তবায়িত হয়, যেখানে লজিকাল শূন্য এবং শারীরিক শূন্য একই হয়। তবে আইইইই -754 ভাষার প্রয়োজন হয় না। সুতরাং এটি ঘটতে পারে যখন আপনি double d = 0;
(লজিকাল শূন্য) করেন, শারীরিকভাবে মেমরির কিছু বিট দখল d
করা শূন্য হবে না।
বহু চরিত্রের ধ্রুবক:
int x = 'ABCD';
এটি সেট x
করে 0x41424344
(বা 0x44434241
, স্থাপত্যের উপর নির্ভর করে)।
সম্পাদনা: এই কৌশলটি পোর্টেবল নয়, বিশেষত যদি আপনি ইনটকে সিরিয়াল করেন। তবে স্ব-ডকুমেন্টিং এনামগুলি তৈরি করতে এটি অত্যন্ত কার্যকর হতে পারে। যেমন
enum state {
stopped = 'STOP',
running = 'RUN!',
waiting = 'WAIT',
};
আপনি যদি কোনও কাঁচা মেমরির ডাম্পের দিকে তাকিয়ে থাকেন এবং কোনও এনামের সন্ধান না করেই এটির মূল্য নির্ধারণ করা প্রয়োজন এটি এটিকে আরও সহজ করে তোলে।
আমি কখনই বিট ফিল্ড ব্যবহার করিনি তবে এগুলি অতি নিম্ন-স্তরের স্টাফের জন্য দুর্দান্ত।
struct cat {
unsigned int legs:3; // 3 bits for legs (0-4 fit in 3 bits)
unsigned int lives:4; // 4 bits for lives (0-9 fit in 4 bits)
// ...
};
cat make_cat()
{
cat kitty;
kitty.legs = 4;
kitty.lives = 9;
return kitty;
}
এর অর্থ এটি sizeof(cat)
যতটা ছোট হতে পারে sizeof(char)
।
হারুন এবং লেপ্পির সমন্বিত মন্তব্যগুলি , ধন্যবাদ ছেলেরা।
সি এর একটি স্ট্যান্ডার্ড রয়েছে তবে সমস্ত সি সংকলক সম্পূর্ণরূপে মেনে চলে না (আমি কোনও সম্পূর্ণ কমপ্লায়েন্ট সি 99 সংকলক এখনও দেখিনি!)।
এটি বলেছিল, যে কৌশলগুলি আমি পছন্দ করি সেগুলি হ'ল প্ল্যাটফর্মগুলি জুড়ে অ-সুস্পষ্ট এবং পোর্টেবল যা তারা সি সিমেটিকের উপর নির্ভর করে। তারা সাধারণত ম্যাক্রো বা বিট পাটিগণিত সম্পর্কে হয়।
উদাহরণস্বরূপ: অস্থায়ী ভেরিয়েবল ব্যবহার না করে দুটি স্বাক্ষরবিহীন পূর্ণসংখ্যার অদলবদল:
...
a ^= b ; b ^= a; a ^=b;
...
বা সীমাবদ্ধ রাষ্ট্রীয় মেশিনগুলির প্রতিনিধিত্ব করতে "বিস্তৃত সি":
FSM {
STATE(x) {
...
NEXTSTATE(y);
}
STATE(y) {
...
if (x == 0)
NEXTSTATE(y);
else
NEXTSTATE(x);
}
}
যা নিম্নলিখিত ম্যাক্রোগুলির সাহায্যে অর্জন করা যেতে পারে:
#define FSM
#define STATE(x) s_##x :
#define NEXTSTATE(x) goto s_##x
সাধারণভাবে, যদিও আমি চালাক নয় এমন কৌশলগুলি পছন্দ করি না তবে কোডটি অকারণে পড়ার জন্য জটিল করে তোলে (অদলবদলের উদাহরণ হিসাবে) এবং কোডগুলি পরিষ্কার করার উদ্দেশ্যে এবং সরাসরি অভিপ্রায়টি জানাতে (এফএসএম উদাহরণের মতো) আমি সেগুলিকে ভালবাসি ।
ডাফের ডিভাইসের মতো ইন্টারলেসিং স্ট্রাকচারগুলি :
strncpy(to, from, count)
char *to, *from;
int count;
{
int n = (count + 7) / 8;
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}
আমি মনোনীত প্রারম্ভিকগুলির খুব পছন্দ, সি 99 এ যুক্ত (এবং দীর্ঘ সময়ের জন্য জিসিসিতে সমর্থিত):
#define FOO 16
#define BAR 3
myStructType_t myStuff[] = {
[FOO] = { foo1, foo2, foo3 },
[BAR] = { bar1, bar2, bar3 },
...
অ্যারের সূচনাটি আর অবস্থান নির্ভর নয়। আপনি যদি এফইও বা বারের মান পরিবর্তন করেন তবে অ্যারে সূচনা স্বয়ংক্রিয়ভাবে তাদের নতুন মানের সাথে মিলবে correspond
বেনামে কাঠামো এবং অ্যারেগুলি আমার পছন্দসই। (সিএফ। http://www.run.montefiore.ulg.ac.be/~martin/resources/kung-f00.html )
setsockopt(yourSocket, SOL_SOCKET, SO_REUSEADDR, (int[]){1}, sizeof(int));
অথবা
void myFunction(type* values) {
while(*values) x=*values++;
}
myFunction((type[]){val1,val2,val3,val4,0});
এমনকি এটি লিঙ্কযুক্ত তালিকাগুলি প্রশমিত করতে ব্যবহার করা যেতে পারে ...
আমি উপভোগ করি এমন সি ভাষায় gcc এর বেশ কয়েকটি এক্সটেনশন রয়েছে, যা এখানে পাওয়া যাবে । আমার প্রিয় কয়েকটি ফাংশন বৈশিষ্ট্য । একটি অত্যন্ত দরকারী উদাহরণ বিন্যাস বৈশিষ্ট্য। আপনি যদি এমন কোনও কাস্টম ফাংশন সংজ্ঞায়িত করেন যা প্রিন্টফ ফর্ম্যাট স্ট্রিং নেয় This আপনি যদি এই ফাংশনটির বৈশিষ্ট্যটি সক্ষম করে থাকেন তবে আপনার ফর্ম্যাট স্ট্রিং এবং আর্গুমেন্টগুলি মিলে গেছে এবং যথাযথ হিসাবে সতর্কতা বা ত্রুটি উত্পন্ন করবে তা নিশ্চিত করার জন্য জিসিসি আপনার আর্গুমেন্টগুলির উপর চেক করবে।
int my_printf (void *my_object, const char *my_format, ...)
__attribute__ ((format (printf, 2, 3)));
আমি যখন প্রথম দেখলাম তখন যে "লুকানো" বৈশিষ্ট্যটি আমাকে "হতবাক" করেছিল তা হ'ল প্রিন্টএফ সম্পর্কে। এই বৈশিষ্ট্যটি আপনাকে তাদের বিন্যাসের ফর্ম্যাট নির্দিষ্টকরণের জন্য ভেরিয়েবলগুলি ব্যবহার করতে দেয়। কোডটি সন্ধান করুন, আপনি আরও ভাল দেখতে পাবেন:
#include <stdio.h>
int main() {
int a = 3;
float b = 6.412355;
printf("%.*f\n",a,b);
return 0;
}
* চরিত্রটি এই প্রভাবটি অর্জন করে।
ঠিক আছে ... আমি মনে করি সি ভাষার অন্যতম শক্তিশালী বিষয় হল এর বহনযোগ্যতা এবং মানকতা, সুতরাং যখনই আমি বর্তমানে ব্যবহার করছি প্রয়োগকরণের মধ্যে যখন কিছু "লুকানো কৌশল" পাওয়া যায়, তখন আমি এটি ব্যবহার করার চেষ্টা করি না কারণ আমি নিজের চেষ্টা করার চেষ্টা করি সি কোড হিসাবে মান এবং সম্ভব হিসাবে পোর্টেবল।
সংকলন-সময় জোর, যেমন ইতিমধ্যে এখানে আলোচনা করা হয়েছে ।
//--- size of static_assertion array is negative if condition is not met
#define STATIC_ASSERT(condition) \
typedef struct { \
char static_assertion[condition ? 1 : -1]; \
} static_assertion_t
//--- ensure structure fits in
STATIC_ASSERT(sizeof(mystruct_t) <= 4096);
ধ্রুব স্ট্রিং কনক্যাটেনেশন
আমি উত্তরগুলিতে এটি পুরোপুরি না দেখে আমি বেশ অবাক হয়েছিলাম, যেহেতু আমি জানি যে সমস্ত সংকলক এটি সমর্থন করে বলে মনে করেন তবে অনেক প্রোগ্রামার এটিকে এড়িয়ে চলেছেন বলে মনে হয়। কখনও কখনও এটি সত্যই সহজ এবং কেবল ম্যাক্রোগুলি লেখার সময় নয়।
আমার বর্তমান কোডটিতে আমার কেস ব্যবহার করুন: আমার কাছে একটি আছে #define PATH "/some/path/"
কোডটিতে থাকা কেসটি একটি কনফিগারেশন ফাইল রয়েছে (সত্যই এটি মেকফিল দ্বারা সেট করা আছে)। এখন আমি রিসোর্সগুলি খুলতে ফাইলের নাম সহ পুরো পথটি তৈরি করতে চাই। এটি কেবল এখানে যায়:
fd = open(PATH "/file", flags);
ভয়ঙ্কর পরিবর্তে, তবে খুব সাধারণ:
char buffer[256];
snprintf(buffer, 256, "%s/file", PATH);
fd = open(buffer, flags);
লক্ষ্য করুন যে সাধারণ ভয়াবহ সমাধানটি হ'ল:
ঠিক আছে, আমি এটি কখনই ব্যবহার করি নি, এবং আমি নিশ্চিত হয়েও জানি না যে আমি এটির আগে কারও কাছে পরামর্শ দিয়েছি কিনা, তবে আমার মনে হয় এই প্রশ্নটি সাইমন টাথামের সহ-রুটিন কৌশল সম্পর্কে উল্লেখ না করেই অসম্পূর্ণ হবে ।
অ্যারে বা এনামগুলি শুরু করার সময়, আপনি প্রাথমিকের তালিকার শেষ আইটেমের পরে কমা রাখতে পারেন। উদাহরণ:
int x[] = { 1, 2, 3, };
enum foo { bar, baz, boom, };
এটি এমনভাবে করা হয়েছিল যাতে আপনি যদি স্বয়ংক্রিয়ভাবে কোড উত্পন্ন করে থাকেন তবে আপনাকে শেষ কমাটি মুছে ফেলার বিষয়ে চিন্তা করার দরকার নেই।
স্ট্রাক্ট অ্যাসাইনমেন্টটি দুর্দান্ত। অনেক লোক বুঝতে পারে না যে স্ট্রাক্টগুলিও খুব মূল্যবান এবং এগুলি চারপাশে নির্ধারিত করা যেতে পারে, ব্যবহার করার দরকার নেইmemcpy()
, যখন কোনও সরল অ্যাসাইনমেন্ট ট্রিকটি করে তখন ।
উদাহরণস্বরূপ, কিছু কাল্পনিক 2D গ্রাফিক্স গ্রন্থাগার বিবেচনা করুন, এটি কোনও (পূর্ণসংখ্যা) স্ক্রিন সমন্বয় উপস্থাপনের জন্য কোনও ধরণের সংজ্ঞা দিতে পারে:
typedef struct {
int x;
int y;
} Point;
এখন, আপনি এমন কাজগুলি করেন যা "ভুল" বলে মনে হতে পারে, যেমন একটি ফাংশন লিখুন যা ফাংশন আর্গুমেন্ট থেকে শুরু করে একটি বিন্দু তৈরি করে, এবং এটিকে ফেরত দেয়:
Point point_new(int x, int y)
{
Point p;
p.x = x;
p.y = y;
return p;
}
এটি নিরাপদ, যতক্ষণ না (অবশ্যই) স্ট্রাক্ট অ্যাসাইনমেন্ট ব্যবহার করে মান দ্বারা অনুলিপি করা হয়:
Point origin;
origin = point_new(0, 0);
এই পদ্ধতিতে আপনি বেশ পরিষ্কার এবং অবজেক্ট-ওরিয়েন্টেড-ইশ কোড লিখতে পারেন, সবগুলি সাধারণ স্ট্যান্ডার্ড সিতে in
অদ্ভুত ভেক্টর সূচক:
int v[100]; int index = 10;
/* v[index] it's the same thing as index[v] */
সি সংকলক কয়েকটি মানক এক প্রয়োগ করে। যাইহোক, একটি মান থাকার অর্থ এই নয় যে ভাষার সমস্ত দিক সংজ্ঞায়িত হয়। ডাফের ডিভাইসউদাহরণস্বরূপ, একটি প্রিয় 'লুকানো' বৈশিষ্ট্য যা এত জনপ্রিয় হয়ে উঠেছে যে আধুনিক সংকলকগণের প্রায়শই ব্যবহৃত প্যাটার্নটির পছন্দসই প্রভাবটি ক্লিষ্ট করে না তা নিশ্চিত করার জন্য বিশেষ উদ্দেশ্য সনাক্তকরণ কোড রয়েছে।
সাধারণ লুকানো বৈশিষ্ট্যগুলিতে বা ভাষার কৌশলগুলি নিরুৎসাহিত করা হয় কারণ আপনি যে কোনও সি স্ট্যান্ডার্ড (গুলি) এর যেটি আপনার সংকলকটি ব্যবহার করেন তার রেজার প্রান্তে চলছে। এ জাতীয় অনেক কৌশল একটি সংকলক থেকে অন্য সংকলনে কাজ করে না এবং প্রায়শই এই ধরণের বৈশিষ্ট্য প্রদত্ত নির্মাতার দ্বারা সংকলক স্যুটটির একটি সংস্করণ থেকে অন্য সংস্করণে ব্যর্থ হয়।
সি কোড ভঙ্গকারী বিভিন্ন কৌশলগুলির মধ্যে রয়েছে:
প্রোগ্রামাররা যখনই 'এক্সপ্লোরার নির্ভর' আচরণ হিসাবে বেশিরভাগ সি স্ট্যান্ডার্ডে সুনির্দিষ্টভাবে নির্ধারিত হয় এমন এক্সিকিউশন মডেল সম্পর্কে অনুমান করে তবেই অন্যান্য সমস্যা ও সমস্যাগুলি দেখা দেয়।
Sscanf ব্যবহার করার সময় আপনি কোথায় পড়তে হবে তা জানতে% n ব্যবহার করতে পারেন:
sscanf ( string, "%d%n", &number, &length );
string += length;
স্পষ্টতই, আপনি অন্য উত্তর যুক্ত করতে পারবেন না, সুতরাং আমি এখানে একটি দ্বিতীয় যুক্ত করব, আপনি "&&" এবং "||" ব্যবহার করতে পারেন শর্ত হিসাবে:
#include <stdio.h>
#include <stdlib.h>
int main()
{
1 || puts("Hello\n");
0 || puts("Hi\n");
1 && puts("ROFL\n");
0 && puts("LOL\n");
exit( 0 );
}
এই কোডটি আউটপুট দেবে:
ওহে rofl
কোডটিতে ব্রেক পয়েন্ট সেট করতে INT (3) ব্যবহার করা আমার সর্বকালের প্রিয়
আমার সি এর প্রিয় "লুকানো" বৈশিষ্ট্যটি হ'ল স্ট্যাকটিতে আবার লিখতে প্রিন্টফের% n ব্যবহার। সাধারণত প্রিন্টফ স্ট্যাট থেকে প্যারামিটারের মানগুলি ফর্ম্যাট স্ট্রিংয়ের উপর ভিত্তি করে পপ করে তবে% n সেগুলি আবার লিখতে পারে।
বিভাগটি এখানে দেখুন 3.4.2 । প্রচুর দুষ্টু দুর্বলতার দিকে নিয়ে যেতে পারে।
এনামগুলি ব্যবহার করে সংকলন-সময় অনুমান-পরীক্ষা করা: বোকা উদাহরণ, তবে কম্পাইল-টাইম কনফিগারযোগ্য ধ্রুবক সহ লাইব্রেরিগুলির জন্য সত্যই কার্যকর হতে পারে।
#define D 1
#define DD 2
enum CompileTimeCheck
{
MAKE_SURE_DD_IS_TWICE_D = 1/(2*(D) == (DD)),
MAKE_SURE_DD_IS_POW2 = 1/((((DD) - 1) & (DD)) == 0)
};
#define CompilerAssert(exp) extern char _CompilerAssert[(exp)?1:-1]
)
জিসিসি (সি) এর কিছু মজাদার বৈশিষ্ট্য রয়েছে যা আপনি সক্ষম করতে পারবেন যেমন নেস্টেড ফাংশন ডিক্লেয়ারেশন এবং?: অপারেটরের a: b ফর্ম যা কোনও মিথ্যা না হলে একটি ফেরত দেয়?
আমি সম্প্রতি 0 বিটফিল্ড আবিষ্কার করেছি।
struct {
int a:3;
int b:2;
int :0;
int c:4;
int d:3;
};
যা একটি লেআউট দেবে
000aaabb 0ccccddd
এর পরিবর্তে: 0;
0000aaab bccccddd
0 প্রস্থের ক্ষেত্রটি জানিয়েছে যে নিম্নলিখিত বিটফিল্ডগুলি পরবর্তী পরমাণু সত্তা ( char
) এ সেট করা উচিত
C99- স্টাইলের পরিবর্তনশীল আর্গুমেন্ট ম্যাক্রোস, ওরফে
#define ERR(name, fmt, ...) fprintf(stderr, "ERROR " #name ": " fmt "\n", \
__VAR_ARGS__)
যা ব্যবহার করা হবে
ERR(errCantOpen, "File %s cannot be opened", filename);
আমি এখানে স্ট্রিংাইজ অপারেটর এবং স্ট্রিং ধ্রুবক কনটেন্টেশন, অন্যান্য বৈশিষ্ট্যগুলিও সত্যিই পছন্দ করি।
পরিবর্তনশীল আকারের স্বয়ংক্রিয় ভেরিয়েবলগুলি কিছু ক্ষেত্রে কার্যকর। এগুলিকে iCC99 এ যুক্ত করা হয়েছিল এবং দীর্ঘ সময় ধরে জিসিসিতে সমর্থন করা হয়েছে।
void foo(uint32_t extraPadding) {
uint8_t commBuffer[sizeof(myProtocol_t) + extraPadding];
আপনি স্থির-আকারের প্রোটোকল শিরোনাম প্লাস ভেরিয়েবল সাইজের ডেটার জন্য স্ট্যাকের স্ট্যাকের একটি বাফার দিয়ে শেষ করতে পারেন। আপনি বরাদ্দ () দিয়ে একই প্রভাব পেতে পারেন তবে এই বাক্য গঠনটি আরও কমপ্যাক্ট।
এই রুটিনটি কল করার আগে আপনাকে অতিরিক্ত প্যাডিং যুক্তিসঙ্গত মান বলে নিশ্চিত করতে হবে, বা আপনি স্ট্যাকটি ফুঁ দিয়ে শেষ করবেন। ম্যালোক বা অন্য কোনও মেমরি বরাদ্দের কৌশলটি কল করার আগে আপনাকে আর্গুমেন্টগুলি পরীক্ষা করতে হবে, সুতরাং এটি সত্যিই অস্বাভাবিক নয়।