Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.78
Diaskop
Сообщений: n/a
#1

Как выглядит нулевой байт? - C++

26.01.2012, 13:30. Просмотров 7549. Ответов 36
Метки нет (Все метки)

Масивы заканчиваются нулевым байтом "/0", это ясно - надо иметь признак конца, но ("/")= 0x2F и ("0")=0x30 , а это уже два байта.
Вопросы: 1. под "нулевым байтом" подразумевают два байта ?
2. если прочитать конец массива, увижу я 0x2F и 0x30?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2012, 13:30     Как выглядит нулевой байт?
Посмотрите здесь:

как выглядит в си++ C++
Как выглядит в си++ C++
как выглядит в си++ C++
C++ strstream (Как записать теперь в s нулевой байт 0, чтобы он не интерпретировался с частью строки?)
Как выглядит изнутри динамическое выделение объекта через new? C++
C++ функция изменяет старший байт числа на заданное значение не изменяя младший байт
C++ Как выглядит конструктор и деструктор для vector ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zelim
77 / 77 / 4
Регистрация: 26.12.2011
Сообщений: 217
26.01.2012, 14:18     Как выглядит нулевой байт? #21
Цитата Сообщение от soon Посмотреть сообщение
Не, пример корявый был в #15
C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main(void)
{
    char str[] = "0123\0 67";
    printf("%d\n", sizeof(str));
    return 0;
}
http://liveworkspace.org/code/c44a9a...26da32950ce01d
http://liveworkspace.org/code/2e73a0...179979cdd04fe6
Отбрасывает все то, что после "0123", как я и говорил.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
26.01.2012, 14:18     Как выглядит нулевой байт? #22
Цитата Сообщение от zelim Посмотреть сообщение
Типичный пример того, как функция sizeof откидывает "мусор".
Так и любые другие функции при чтении массива ищут нуль-символ.
Сайзоф не ищет нуль-символ, да и функцию можно сделать также.
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.01.2012, 14:19     Как выглядит нулевой байт? #23
Цитата Сообщение от zelim Посмотреть сообщение
Отбрасывает все то, что после "0123", как я и говорил.
Дак вы же про sizeof говорили, мол она по нуль-терминанте высчитывает размер.
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
26.01.2012, 14:20     Как выглядит нулевой байт? #24
http://liveworkspace.org/code/7741b0...e0c0250b012582

Отбрасывается ТОЛЬКО при выводе(преобразовании в Си-строку). Массив после \0 никуда не девается, он продолжает хранится в памяти!
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.01.2012, 14:20     Как выглядит нулевой байт? #25
Нет, не вы, извиняюсь. Пост относился к Fusix
zelim
77 / 77 / 4
Регистрация: 26.12.2011
Сообщений: 217
26.01.2012, 14:23     Как выглядит нулевой байт? #26
Цитата Сообщение от soon Посмотреть сообщение
Нет, не вы, извиняюсь. Пост относился к Fusix
В 14 посте я цитировал Fusix. Там про sizeof и было сказано.
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.01.2012, 14:29     Как выглядит нулевой байт? #27
Цитата Сообщение от zelim Посмотреть сообщение
В 14 посте я цитировал Fusix. Там про sizeof и было сказано.
Ааа, вот оно что. Тогда действительно еще и к вам вопрос
Цитата Сообщение от zelim Посмотреть сообщение
Типичный пример того, как функция sizeof откидывает "мусор".
И какой же мусор она откидывает?
Fusix
0 / 0 / 0
Регистрация: 08.10.2010
Сообщений: 133
26.01.2012, 14:39     Как выглядит нулевой байт? #28
Цитата Сообщение от zelim Посмотреть сообщение
В 14 посте я цитировал Fusix. Там про sizeof и было сказано.
Я с такой проблемой сталкивался, что sizeof определяет размер до первого 0x00. Теперь я ему не доверяю работу с буферами... Но я хотел сказать то, что массив char он можно сказать охватывает всю память. У него есть адрес начала, а дальше по индексу в сторону увеличения и до конца памяти. Если размер статический, то это уже не важно. Из моего опыта 0x00 считается концом строки и по нему обрезается. Если это не строка, а набор байт, то в нем уже необходимости нет.

Добавлено через 54 секунды
Цитата Сообщение от soon Посмотреть сообщение
Ааа, вот оно что. Тогда действительно еще и к вам вопрос

И какой же мусор она откидывает?
Она мусор не откидывает ИМХО. Просто возвращает размер до первого нулевого байта
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
26.01.2012, 14:43     Как выглядит нулевой байт? #29
Цитата Сообщение от Fusix Посмотреть сообщение
Я с такой проблемой сталкивался, что sizeof определяет размер до первого 0x00. Теперь я ему не доверяю работу с буферами... Но я хотел сказать то, что массив char он можно сказать охватывает всю память. У него есть адрес начала, а дальше по индексу в сторону увеличения и до конца памяти. Если размер статический, то это уже не важно. Из моего опыта 0x00 считается концом строки и по нему обрезается. Если это не строка, а набор байт, то в нем уже необходимости нет.
Вы наверно с указателями баловались? Тогда это всё объясняет.

Цитата Сообщение от Fusix Посмотреть сообщение
Она мусор не откидывает ИМХО. Просто возвращает размер до первого нулевого байта
См. мою ссылку. Там sizeof выдает 12 - почему?
zelim
77 / 77 / 4
Регистрация: 26.12.2011
Сообщений: 217
26.01.2012, 14:47     Как выглядит нулевой байт? #30
Цитата Сообщение от soon Посмотреть сообщение
И какой же мусор она откидывает?
Имел ввиду, что то, что находится за спец. символом, функция не считает. Ориентировался на пример Fusix. Вы же показали, что это не так (правда в первом примере, вроде пост 15, который удалили, sizeof все-таки неправильно посчитал вроде бы).
Под мусором имел ввиду символы, занимающие ячейки памяти. Например, будет у нас строка "01234" - присвоим третьему (произвольно) элементу массива значение '\0' - функции вида printf будут выдавать "01", считая "34" мусором. Я это подразумевал.
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.01.2012, 14:48     Как выглядит нулевой байт? #31
Цитата Сообщение от Teravisor Посмотреть сообщение
Вы наверно с указателями баловались? Тогда это всё объясняет.
Тогда бы возвращался sizeof(char*). Т.е. всегда определенное число, а не "до первого \0".

Fusix, приведите код, в котором sizeof выводит не то, что требуется.
Fusix
0 / 0 / 0
Регистрация: 08.10.2010
Сообщений: 133
26.01.2012, 14:49     Как выглядит нулевой байт? #32
Цитата Сообщение от Teravisor Посмотреть сообщение
Вы наверно с указателями баловались? Тогда это всё объясняет.



См. мою ссылку. Там sizeof выдает 12 - почему?
Понятно. Спасибо за пояснение.
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.01.2012, 14:50     Как выглядит нулевой байт? #33
Цитата Сообщение от zelim Посмотреть сообщение
правда в первом примере, вроде пост 15, который удалили, sizeof все-таки неправильно посчитал вроде бы).
Там была не нуль-терминанта, а \056. Пробел просто не поставил.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
26.01.2012, 14:55     Как выглядит нулевой байт? #34
Цитата Сообщение от zelim Посмотреть сообщение
значение '\0' - функции вида printf будут выдавать "01", считая "34" мусором. Я это подразумевал.
Мусор, это то, что находится по адресу, большему(или равному) чем
C++
1
s + sizeof(s);
Fusix
0 / 0 / 0
Регистрация: 08.10.2010
Сообщений: 133
26.01.2012, 15:00     Как выглядит нулевой байт? #35
Цитата Сообщение от soon Посмотреть сообщение
Тогда бы возвращался sizeof(char*). Т.е. всегда определенное число, а не "до первого \0".

Fusix, приведите код, в котором sizeof выводит не то, что требуется.
Да все верно, я тогда указатели испрользовал. Вот:
C++
1
2
3
4
5
6
7
   char *s = new char[5];
   s[0] = 0xff;
   s[1] = 0xff;
   s[2] = 0x00;
   s[3] = 0xff;
   s[4] = 0xff;
   printf("%d\n",sizeof(s));
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
26.01.2012, 15:04     Как выглядит нулевой байт? #36
Цитата Сообщение от Fusix Посмотреть сообщение
Да все верно, я тогда указатели испрользовал. Вот:
C++
1
2
3
4
5
6
7
   char *s = new char[5];
   s[0] = 0xff;
   s[1] = 0xff;
   s[2] = 0x00;
   s[3] = 0xff;
   s[4] = 0xff;
   printf("%d\n",sizeof(s));
Execution output:
4

а нулик то после 2го элемента... выдало sizeof(char*) - т.е. размер указателя, обычно int по размеру, т.е. 4.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2012, 15:05     Как выглядит нулевой байт?
Еще ссылки по теме:

C++ Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт
C++ Как выглядит string в памяти?
C++ Как выглядит восьмибитная маска в шестнадцатеричной форме?
C++ Как выглядит адрес переменной
Как в блок-схеме выглядит структура? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.01.2012, 15:05     Как выглядит нулевой байт? #37
Цитата Сообщение от Fusix Посмотреть сообщение
Да все верно, я тогда указатели испрользовал. Вот:
И? Выводит sizeof(char*), как я и сказал в посте #31

Замените s[2] = 0x00; на s[0] = 0x00; и увидите, что sizeof никоим образом не зависит от расположения нуль-терминанты
Yandex
Объявления
26.01.2012, 15:05     Как выглядит нулевой байт?
Ответ Создать тему
Опции темы

Текущее время: 14:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru