• 周四. 5月 30th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

解析#define NULL ((void *)0)——野指针,空指针和 void*

admin

11月 28, 2021

在编写程序时,我们经常会遇到这样的语句:

#define NULL 0 
#define NULL ((void*)0)

空指针是一个被赋值为0的指针,在没有被具体初始化之前,其值为0.
NULL 是一个标准规定的宏定义,用来表示空指针常量。以上两种定义都可以用来定义一个空指针。

那么问题来了,我们为什么要定义一个空指针NULL?

下面先了解一下野指针

一:野指针
“野指针”不是NULL指针,是指向“垃圾”内存的指针。

“野指针”的成因主要有3种:

(1)指针变量没有被初始化。任何指针变量刚被创建时,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如

     char *p = NULL;
     char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL,成为一个野指针,让人误以为p是个合法的指针。

free和delete只是把指针所指的内存给释放掉,但并没有把指针本身清除。free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。

如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

 char *p = (char *) malloc(100);
 strcpy(p, “hello”);
 free(p);         // p 所指的内存被释放,但是p所指的地址仍然不变
 …
 if(p != NULL)      // 没有起到防错作用
 {
    strcpy(p, “world”);      // 出错
 }

(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:

class A 
{      
    public:
    void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
    A *p;
    {
       A a;
       p = &a;      // 注意 a 的生命期
    }
    p->Func();            // p是“野指针”
}

函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。

二 :空指针/0/NULL
了解了野指针,那就不难理解NULL指针了!
那么我们定义一个空指针的目的可以归纳为一下:
(1)定义NULL指针,可以初始化一个指针变量,避免它成为一个野指针

#define NULL 0 
#define NULL ((void*)0)

(2)将空指针赋值给一个被释放的指针变量,避免它成为一个野指针

free(p)
p=NULL

(3)判断一个指针变量是否是有效指针,避免对一个空指针或一个野指针操作

判断一个指针是否为空指针:

1. f(!p) 
2. if(p == NULL) 
3. if(NULL == p)

最好使用后两种,有些平台NULL不是0,这时候程序就会有问题了。

其中if(NULL == p) 与if(p == NULL) 没有区别,前一种是避免错误的写法(后面的容易写成P=NULL,编译器不能发现。而前面的写成NULL=p时会编译不过)。

一般在使用指针前(特别是对其进行加减)要对其进行判断 if(p == NULL) , 如函数返回的地址等进行非空判断。

Item* pItem = itemList.getItem(index);

Item* ItemList::getItem(int index)
{
    if (index < 0) return NULL;
    if (index >= size()) return NULL;
    return _list[index];
}

如果返回的是空指针,且后面对pItem做了相关的操作,会有空指针异常,程序可能会崩溃。

三:VOID类型
void的字面意思是“无类型”,void 则为“无类型指针”,void 可以指向任何类型的数据。

void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:

void a;

这行语句编译时会出错,提示“illegal use of type ‘void’”。不过,即使void a的编译不会出错,它也没有任何实际意义。

void真正发挥的作用在于:
(1) 对函数返回的限定;
(2) 对函数参数的限定。

众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:

float *p1;
int *p2;
p1 = p2;

  其中p1 = p2语句会编译出错,提示“’=’ : cannot convert from ‘int ’ to ‘float ‘”,必须改为:

p1 = (float *)p2;

而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:

void *p1;
int *p2;
p1 = p2;

  但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。

void *p1;
int *p2;
p2 = p1;

  提示“’=’ : cannot convert from ‘void ’ to ‘int ‘”。

下面给出void关键字的使用规则:

规则一 如果函数没有返回值,那么应声明为void类型

在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型。例如:

add ( int a, int b )
{
return a + b;
}
int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}

  程序运行的结果为输出:

2 + 3 = 5

这说明不加返回值说明的函数的确为int函数。

《高质量C/C++编程》中提到:“C++语言有很严格的类型安全检查,不允许上述情况(指函数不加类型声明)发生”。可是编译器并不一定这么认定,譬如 在Visual C++6.0中上述add函数的编译无错也无警告且运行正确,所以不能寄希望于编译器会做严格的类型检查。

因此,为了避免混乱,我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void类型。这既是程序 良好可读性的需要,也是编程规范性的要求。另外,加上void类型声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。

规则二 如果函数无参数,那么应声明其参数为void
在C++语言中声明一个这样的函数:

int function(void)
{
return 1;
}

则进行下面的调用是不合法的:

function(2);

因为在C++中,函数参数为void的意思是这个函数不接受任何参数。

我们在Turbo C 2.0中编译:

#include "stdio.h"
fun()
{
return 1;
}
main()
{
printf("%d",fun(2));
getchar();
}

  编译正确且输出1,这说明,在C语言中,可以给无参数的函数传送任意类型的参数,但是在C++编译器中编译同样的代码则会出错。在C++中,不能向无 参数的函数传送任何参数,出错提示“’fun’ : function does not take 1 parameters”。
所以,无论在C还是C++中,若函数不接受任何参数,一定要指明参数为void。

规则三 小心使用void指针类型

按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:

void * pvoid;
pvoid++; //ANSI:错误
pvoid += 1; //ANSI:错误

//ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。
//例如:

int *pint;
pint++; //ANSI:正确

pint++的结果是使其增大sizeof(int)。

但是大名鼎鼎的GNU(GNU’s Not Unix的缩写)则不这么认定,它指定void 的算法操作与char 一致。

因此下列语句在GNU编译器中皆正确:

pvoid++; //GNU:正确
pvoid += 1; //GNU:正确

  pvoid++的执行结果是其增大了1。
在实际的程序设计中,为迎合ANSI标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:

void * pvoid;
(char *)pvoid++; //ANSI:正确;GNU:正确
(char *)pvoid += 1; //ANSI:错误;GNU:正确

规则四 如果函数的参数可以是任意类型指针,那么应声明其参数为void *

典型的如内存操作函数memcpy和memset的函数原型分别为:

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内 存是什么类型。如果memcpy和memset的参数类型不是void ,而是char ,那才叫真的奇怪了!这样的memcpy和memset明显不是一个“纯粹的,脱离低级趣味的”函数!

下面的代码执行正确:

//示例:memset接受任意类型指针

int intarray[100];
memset ( intarray, 0, 100*sizeof(int) ); //将intarray清0
//示例:memcpy接受任意类型指针
int intarray1[100], intarray2[100];
memcpy ( intarray1, intarray2, 100*sizeof(int) ); //将intarray2拷贝给intarray1

  有趣的是,memcpy和memset函数返回的也是void *类型,标准库函数的编写者是多么地富有学问啊!

规则五 void不能代表一个真实的变量

下面代码都企图让void代表一个真实的变量,因此都是错误的代码:

**void a; //错误
function(void a); //错误**

void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。正如不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void为“抽象数据类型”)变量。

非常感谢三联3LIAN.com文章《空指针(NULL,0),野指针,void*的讲解》的作者,参考了他的很多内容。
http://www.3lian.com/edu/2013/07-12/80463.html

《解析#define NULL ((void *)0)——野指针,空指针和 void*》有28个想法
  1. Восторгаемся возможностью анонсировать новейшее обновление приложения от БК Олимп для Android! Ваше умение и опыт со ставками на спорт станет невероятно комфортным благодаря обновленному интерфейсу и оптимизированной работе программы. Скачать приложение Олимп уже сегодня! С последней версией приложения вы получите прямой доступ к разнообразию спортивных событий прямо с вашего мобильного устройства. Ожидайте расширенные возможности для управления счетом, современный дизайн для интуитивного пользования и значительное улучшение скорости приложения. Присоединитесь довольных клиентов БК Олимп и радуйтесь ставкам где угодно и когда угодно. Загрузите последнюю версию приложения уже сейчас и начните побеждать вместе с Олимп!

  2. Howdy! Do you know if they make any plugins to assist with SEO?
    I’m trying to get my blog to rank for some
    targeted keywords but I’m not seeing very good gains.

    If you know of any please share. Cheers! You can read similar blog
    here: Sklep online

  3. 1. Вибір натяжних стель – як правильно обрати?
    2. Топ-5 популярних кольорів натяжних стель
    3. Як зберегти чистоту натяжних стель?
    4. Відгуки про натяжні стелі: плюси та мінуси
    5. Як підібрати дизайн натяжних стель до інтер’єру?
    6. Інноваційні технології у виробництві натяжних стель
    7. Натяжні стелі з фотопечаттю – оригінальне рішення для кухні
    8. Секрети вдалого монтажу натяжних стель
    9. Як зекономити на встановленні натяжних стель?
    10. Лампи для натяжних стель: які вибрати?
    11. Відтінки синього для натяжних стель – ексклюзивний вибір
    12. Якість матеріалів для натяжних стель: що обирати?
    13. Крок за кроком: як самостійно встановити натяжні стелі
    14. Натяжні стелі в дитячу кімнату: безпека та креативність
    15. Як підтримувати тепло у приміщенні за допомогою натяжних стель
    16. Вибір натяжних стель у ванну кімнату: практичні поради
    17. Натяжні стелі зі структурним покриттям – тренд сучасного дизайну
    18. Індивідуальність у кожному домашньому інтер’єрі: натяжні стелі з друком
    19. Як обрати освітлення для натяжних стель: поради фахівця
    20. Можливості дизайну натяжних стель: від класики до мінімалізму
    дворівневі натяжні стелі https://www.natjazhnistelitvhyn.kiev.ua .

  4. Да, действительно. Я присоединяюсь ко всему выше сказанному. Давайте обсудим этот вопрос. Здесь или в PM.
    где купить? конечно, у нас! Мужчинам цветы тоже дарят, однако тут есть нюансы: конструкция из цветов должна быть строгой, без вычурностей, вытянутой вверх, http://finforum.org/index.php?app=forums&module=post&section=post&do=reply_post&f=50&t=8149&qpid=152718&k=880ea6a14ea49e853634fbdc5015a024&setlanguage=1&langurlbits=app=forums&cal_id=&langid=3 пирамидальной формы.

  5. 1. Почему берцы – это обязательный элемент стиля?
    2. Как выбрать идеальные берцы для осеннего гардероба?
    3. Тренды сезона: кожаные берцы или замшевые?
    4. 5 способов носить берцы с платьем
    5. Какие берцы выбрать для повседневного образа?
    6. Берцы на платформе: комфорт и стиль в одном
    7. Какие берцы будут актуальны в этом году?
    8. Маст-хэв сезона: военные берцы в стиле милитари
    9. 10 вариантов сочетания берцов с джинсами
    10. Зимние берцы: как выбрать модель для холодного сезона
    11. Элегантные берцы на каблуке: идеальный вариант для офиса
    12. Секреты ухода за берцами: как сохранить первоначальный вид?
    13. С какой юбкой носить берцы: советы от стилистов
    14. Как подобрать берцы под фасон брюк?
    15. Берцы на шнуровке: стильный акцент в образе
    16. Берцы-челси: универсальная модель для любого стиля
    17. С чем носить берцы на плоской подошве?
    18. Берцы с ремешками: акцент на деталях
    19. Как выбрать берцы для прогулок по городу?
    20. Топ-5 брендов берцев: качество и стиль в одном
    купити берці зсу берці talan .

  6. Подробное руководство
    2. Секреты монтажа гипсокартона: шаг за шагом инструкция
    3. Гипсокартонные конструкции: основные виды и их преимущества
    4. Как сэкономить при покупке гипсокартона: лучшие способы
    5. Простые способы обработки гипсокартона: советы от профессионалов
    6. Интересные идеи использования гипсокартона в интерьере
    7. Все, что вам нужно знать о гипсокартоне: полезная информация
    8. Гипсокартон: обзор популярных брендов и их характеристики
    9. Плюсы и минусы гипсокартона: как правильно выбрать материал
    10. Как сделать ровные стены с помощью гипсокартона: секреты и советы
    11. Гипсокартонные потолки: виды и технологии монтажа
    12. Декорирование гипсокартона: идеи для творческого подхода
    13. Гипсокартон в дизайне интерьера: современные тренды и решения
    14. Преимущества гипсокартона перед другими строительными материалами
    15. Как выбрать правильный инструмент для работы с гипсокартоном
    16. Гипсокартон: надежный материал для обустройства дома
    17. Гипсокартон как элемент декора: необычные способы применения
    18. Технологии монтажа гипсокартона: лучшие практические советы
    19. История и развитие гипсокартона: открытия и достижения
    20. Строительство с использованием гипсокартона: основные этапы и рекомендации
    строительные материалы купить магазины строительных материалов москва .

  7. 1. Идеи для дизайна интерьера
    2. Тренды в дизайне
    3. Как выбрать идеальный цветовой акцент в дизайне
    4. Дизайн-проект
    5. Дизайн нового поколения
    6. Шаг за шагом: создание уютного дизайна спальни
    7. Дизайн для маленькой квартиры
    8. Природный дизайн
    9. Баланс цветов и форм: основы хорошего дизайна
    10. Дизайн-студия: секреты успешного бизнеса в сфере дизайна
    11. Интересные факты о развитии дизайна в XXI веке
    12. Дизайн кухни
    13. Дизайн мебели
    14. Дизайн гостиной
    15. Искусство минимализма: создание современного дизайна в своем доме
    16. Дизайн сада: принципы оформления участка с учетом ландшафта
    17. Декорирование с текстилем
    18. Принципы цветового баланса в дизайне: как создать гармоничное пространство
    19. Книги по дизайну
    20. Дизайн комнаты для подростка: креативные идеи для стильного интерьера
    дизайн квартир дизайн квартир .

  8. Як використовувати тактичний рюкзак у місті

    військові тактичні рюкзаки [url=https://ryukzakivijskovibpjgl.kiev.ua/]https://ryukzakivijskovibpjgl.kiev.ua/[/url] .

  9. Brands that manufacture chronometer watches
    Understanding COSC Validation and Its Importance in Watchmaking
    COSC Validation and its Demanding Criteria
    Controle Officiel Suisse des Chronometres, or the Official Swiss Chronometer Testing Agency, is the official Swiss testing agency that certifies the accuracy and accuracy of timepieces. COSC validation is a sign of excellent craftsmanship and reliability in timekeeping. Not all timepiece brands follow COSC certification, such as Hublot, which instead follows to its own demanding standards with movements like the UNICO, achieving similar accuracy.

    The Science of Exact Timekeeping
    The core system of a mechanized timepiece involves the mainspring, which provides energy as it loosens. This system, however, can be vulnerable to external elements that may influence its precision. COSC-validated mechanisms undergo demanding testing—over fifteen days in various circumstances (five positions, three temperatures)—to ensure their resilience and dependability. The tests measure:

    Mean daily rate precision between -4 and +6 seconds.
    Mean variation, maximum variation rates, and impacts of temperature changes.
    Why COSC Accreditation Matters
    For timepiece aficionados and connoisseurs, a COSC-validated timepiece isn’t just a item of tech but a testament to lasting excellence and accuracy. It signifies a watch that:

    Presents excellent reliability and precision.
    Provides guarantee of quality across the whole construction of the timepiece.
    Is likely to retain its worth better, making it a wise investment.
    Popular Timepiece Manufacturers
    Several renowned manufacturers prioritize COSC certification for their watches, including Rolex, Omega, Breitling, and Longines, among others. Longines, for instance, offers collections like the Record and Spirit, which feature COSC-validated mechanisms equipped with advanced substances like silicone equilibrium suspensions to enhance durability and efficiency.

    Historic Context and the Evolution of Chronometers
    The idea of the timepiece dates back to the requirement for accurate chronometry for navigation at sea, emphasized by John Harrison’s work in the 18th cent. Since the formal establishment of COSC in 1973, the certification has become a yardstick for judging the accuracy of luxury timepieces, maintaining a legacy of excellence in horology.

    Conclusion
    Owning a COSC-certified timepiece is more than an visual choice; it’s a commitment to excellence and accuracy. For those valuing precision above all, the COSC validation provides peace of mind, ensuring that each accredited watch will operate dependably under various circumstances. Whether for personal contentment or as an investment, COSC-certified timepieces distinguish themselves in the world of horology, bearing on a tradition of meticulous timekeeping.

  10. Вы хотите приобрести увлекательные сериалы на dvd? Serialexpress готов вам в этом помочь. Здесь вы найдете диски, которых в других магазинах нет. Качество записи сериалов отличное, уверены, что вы останетесь довольны приобретением. Товары доступны по привлекательной цене, они хорошо упакованы и целые. Ищете купить сериал в смоленске? Serialexpress.ru – сайт, где имеется каталог. Здесь также можно ознакомиться с условиями оплаты. У нас действует накопительные скидки. Качество доставки вас приятно удивит. Все вопросы можно задать менеджерам по электронной почте.

  11. 1. Вибір натяжної стелі: як правильно підібрати?
    2. ТОП-5 переваг натяжних стель для вашого інтер’єру
    3. Як доглядати за натяжною стелею: корисні поради
    4. Натяжні стелі: модний тренд сучасного дизайну
    5. Як вибрати кольорову гаму для натяжної стелі?
    6. Натяжні стелі від А до Я: основні поняття
    7. Комфорт та елегантність: переваги натяжних стель
    8. Якість матеріалів для натяжних стель: що обрати?
    9. Ефективне освітлення з натяжними стелями: ідеї та поради
    10. Натяжні стелі у ванній кімнаті: плюси та мінуси
    11. Як відремонтувати натяжну стелю вдома: поетапна інструкція
    12. Візуальні ефекти з допомогою натяжних стель: ідеї дизайну
    13. Натяжні стелі з фотопринтом: оригінальний дизайн для вашого інтер’єру
    14. Готові або індивідуальні: які натяжні стелі обрати?
    15. Натяжні стелі у спальні: як створити атмосферу затишку
    16. Вигода та функціональність: чому варто встановити натяжну стелю?
    17. Натяжні стелі у кухні: практичність та естетика поєднуються
    18. Різновиди кріплень для натяжних стель: який обрати?
    19. Комплектація натяжних стель: що потрібно знати при виборі
    20. Натяжні стелі зі звукоізоляцією: комфорт та тиша у вашому будинку!

    moonlight натяжні стелі https://natyazhnistelidfvf.kiev.ua/ .

  12. Почему теневой плинтус – красивая и практичная деталь интерьера,
    Как правильно установить теневой плинтус своими руками,
    Как использовать теневой плинтус для создания уникального интерьера,
    Модные тренды в выборе теневых плинтусов для современного дома,
    Советы стилиста: как сделать цвет теневого плинтуса акцентом в помещении,
    Как спрятать коммуникации с помощью теневого плинтуса: практические советы,
    Интересные решения с теневым плинтусом и подсветкой: идеи для вдохновения,
    Как сделать помещение завершенным с помощью теневого плинтуса,
    Теневой плинтус: деталь, которая делает интерьер законченным и гармоничным
    плинтус алюминиевый плинтус алюминиевый .

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注