در C ، NULL یک ثابت نمادین است که همیشه به نقطه ای وجود ندارد که در حافظه وجود دارد. اگرچه بسیاری از برنامه نویسان آن را برابر 0 می دانند ، اما این یک ساده سازی است که می تواند بعداً شما را تحت تأثیر قرار دهد. بهتر است اشاره گرهای خود را مستقیماً در برابر NULL بررسی کنید و در زمینه های دیگر از 0 استفاده کنید. این کار کد شما را تمیز نگه می دارد و درک آن آسان است ، زیرا می دانید که هر بار که NULL را مشاهده می کنید با اشاره گرها کار می کنید.
مراحل
قسمت 1 از 2: انجام یک بررسی تهی
مرحله 1. از کد چک استاندارد تهی استفاده کنید
موارد زیر واضح ترین روش برای نوشتن چک باطل است. استفاده خواهیم کرد ptr در این مقاله به عنوان نام اشاره گر در حال بررسی هستید.
-
if (ptr == NULL)
{
// کد اگر اشاره گر NULL باشد
} دیگری {
// کد اگر NULL نیست
}
مرحله 2. برای هر مقداری به جز NULL تست کنید
گاهی راحت تر می توان نابرابری را آزمایش کرد. در اینجا هیچ شگفتی وجود ندارد:
-
if (ptr! = NULL) {
// کد اگر NULL نیست
}
مرحله 3. برای جلوگیری از خطا (اختیاری) ابتدا NULL را بنویسید
نقطه ضعف اصلی روش PTR == NULL این است که به طور تصادفی به جای آن ptr = NULL را تایپ کنید و مقدار NULL را به آن اشاره گر اختصاص دهید. این می تواند باعث سردرد شدید شود. از آنجا که آزمایش برابری (غیر) با عملوندها به صورت متقارن رفتار می کند ، می توانید با نوشتن دقیقاً به همان نتیجه برسید if (NULL == ptr) بجای. این بیشتر در برابر اشتباهات تایپی مقاوم است ، زیرا NULL = ptr تصادفی یک خطای کامپایل ساده ایجاد می کند.
این برای برخی از برنامه نویسان کمی ناخوشایند به نظر می رسد ، اما کاملاً معتبر است. اینکه از کدام رویکرد استفاده می کنید فقط به ترجیح شخصی بستگی دارد و کامپایلر شما در تشخیص خطای if (ptr = NULL) چقدر خوب است
مرحله 4. صحت متغیر را بررسی کنید
یک ساده اگر (ptr) آزمایش می کند که آیا ptr TRUE است یا خیر. اگر ptr NULL باشد ، یا اگر ptr 0 باشد FALSE برمی گرداند. تمایز در بسیاری از موارد مهم نیست ، اما توجه داشته باشید که اینها در همه معماری ها یکسان نیستند.
برعکس این است اگر (! ptr) ، که اگر ptr FALSE باشد TRUE برمی گرداند.
قسمت 2 از 2: اجتناب از اشتباهات
مرحله 1. قبل از بررسی NULL ، یک اشاره گر تنظیم کنید
یک اشتباه رایج این است که فرض کنیم یک اشاره گر تازه ایجاد شده دارای مقدار NULL است. این درست نیست. یک اشاره گر تعیین نشده هنوز به یک آدرس حافظه اشاره می کند ، نه آدرس دیگری که شما مشخص کرده اید. معمول است که اشاره گرهای تازه ایجاد شده یا تازه آزاد شده را روی NULL قرار دهید تا مطمئن شوید از این آدرس غیر مفید به طور تصادفی استفاده نمی کنید.
-
از این اشتباه اجتناب کنید:
char *ptr؛
if (ptr == NULL)
{
// این FALSE را برمی گرداند. به نشانگر یک مقدار معتبر اختصاص داده شده است.
}
-
در عوض بنویسید:
char *ptr = NULL؛ // این نشانگر را به NULL اختصاص می دهد
if (ptr == NULL)
{
// اگر اشاره گر مجدداً تخصیص داده نشود ، TRUE برمی گردد.
}
مرحله 2. به توابعی که می توانند NULL را برگردانند توجه کنید
اگر تابعی می تواند NULL را برگرداند ، به این فکر کنید که آیا این امکان وجود دارد یا خیر و آیا بعداً در کد شما مشکل ایجاد می کند یا خیر. در اینجا نمونه ای از عملکرد malloc با استفاده از بررسی null (اگر (ptr)) برای اطمینان از اینکه فقط اشاره گرها را با مقادیر معتبر اداره می کند:
-
int * ptr = malloc (N * sizeof (int)) ؛
if (ptr) {
int i؛
برای (i = 0؛ i <N؛ ++ i)
ptr = i ؛
}
مرحله 3. درک کنید که NULL 0 است اما هنگام کار با اشاره گرها برای وضوح باید همیشه از NULL به جای 0 استفاده کنید
از لحاظ تاریخی ، C NULL را به عنوان عدد 0 (یعنی 0x00) نشان می دهد. امروزه ممکن است کمی پیچیده تر شود و بسته به سیستم عامل متفاوت است. معمولاً می توانید با استفاده از NULL بررسی کنید ptr == 0 ، اما موارد گوشه ای وجود دارد که می تواند باعث ایجاد مشکل شود. شاید مهمتر از آن ، استفاده از NULL بدیهی است که شما با اشاره گرهایی برای سایر افرادی که کد شما را می خوانند کار می کنید.