• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

В чем разница между 0 и '\0'

  • Автор темы rrrFer
  • Дата начала
R

rrrFer

1. А ты в курсе, что NULL и '\0' это не одно и тоже?
хм, а я не совсем в курсе...ну на самом деле. Вроде бы Страуструп не рекомендует юзать NULL(а советует использовать 0) без особой на то причины(я такой "особой" причины не видел ни разу). '\0' - это нуль-терминатор, конец строки. Я всегда использовал вместо этого '0'(без кавычек), никакого дискомфорта и угрызений совести не замечал.
Ну если пояснишь различия...я буду благодарен )
 
L

lazybiz

Ну если пояснишь различия...я буду благодарен )
'\0' - это однобайтовый 0. Думаю что в некоторых случаях с ним могут возникнуть проблемы, хотя он и работает в данном случае.
 
R

rrrFer

lazybiz
если у тебя строка символов и ты в конец дописываешь ноль - то ты символу(1 байт) присвоил значение ноль, что эквивалентно символу '\0'.
Вобщем, ИМХО проблем не должно возникать...Попробуй придумать пример который это демонстрирует(демонстрирует ошибки, в смысле)?
 
L

lazybiz

Конечно маловероятный вариант, но все же) :
C++:
#include <iostream>

using namespace std;

int main()
{
void *	p_A;
void *	p_B;

int		l_A = sizeof(  0 ) * 100;
int		l_B = sizeof( '\0' ) * 100;

p_A = new char [l_A];
p_B = new char [l_B];

cout << "l_A = " << l_A << endl;
cout << "l_B = " << l_B << endl;

return 0;
}
 
R

rrrFer

lazybiz
не...ну тут ты сравниваешь символ и целое число, естественно они занимают разное количество байт, но все шло в том контексте, что этот символ должен быть на конце строки.
А тут сравнение прошло примерно так... '1' занимает 1 байт, а 49 - занимает 4 байта.

но
char c = 0;
char c = '\0';
разницы нет, ну хотя конечно аскей коды не хорошо использовать всюду - они по-любому не упрощают восприятие кода...ну и могут различаться иногда, в зависимости от используемой кодовой таблицы.
 
L

lazybiz

Хорошо. Ты победил. Но все же правильней и наглядней писать 0 или NULL. Если функция требует void *, то дай ей void * а не int. Ну или хотя бы скасти int в void * :)
 
R

rrrFer

хм...хм..., я не старался )
наглядней писать 0 или NULL
про 0 можно спорить ИМХО, хотя нет желания, я сам 0 пишу )
а про NULL не соглашусь. В качестве единственного аргумента использую авторитет Страуструпа(хотя, кто-то не менее авторитетный сказал "ссылка на авторитет - не доказательство" ).
Дак вот Страуструп пишет:
....злосчастный макрос NULL....
а почему он столь злосчастен поясняет так:
В языке С было очень популярно определять макрос NULL для представления такого[1] нулевого указателя. Т.к. в С++ типы проверяются более жестко, использование банального нуля вместо NULL приведет к меньшим проблемам. Если чувствуете что просто обязаны определить NULL воспользуйтесь
Код:
const int NULL = 0;
модификатор const предотвращает ненамеренное замещение NULL и гарантирует, что NULL можно использовать везде где требуется константа.
[1] Такого, т.е. указателя равного нулю, т.е. не ссылающегося ни на что.
Ну вобщем, опять я явных причин отказываться от NULL не вижу, но если Страуструп против, да и множество программистов брызжут пеной при виде NULL - то я отказываюсь от него, ну т.к. мне не принципиально :)
 
W

woka

не знаю может конечно я и не прав но на сколько я помню, то "'\0" это "терминатор-ноль" или как то похоже называется, который ставиться на конце строки.
не в контексте этой темы, а в контексте С++.
 
L

lazybiz

"\0" - это два ноля подряд. правильней будет сказать '\0'
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!