Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/55: Рейтинг темы: голосов - 55, средняя оценка - 4.82
Diaskop
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 2
#1

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

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

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

strstream (Как записать теперь в s нулевой байт 0, чтобы он не интерпретировался с частью строки?)
int main() { strstream s; s << "555"; cout << s.str() << endl;...

Как выглядит в си++
Program pravii; uses crt; var...

как выглядит в си++
Program kursak; Const Nmax = 5; {Максимальный размер массива} Type ...

как выглядит в си++
var i,n:integer; a,b,h,x,xb,s:real; function f(x:real):real; ...

Как выглядит адрес переменной
Например: в массиве m={4,6,2} адрес второго элемента. Это будет 16-ричное число...

36
zelim
77 / 77 / 9
Регистрация: 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/c44a9a91f0787926c426da32950ce01d
http://liveworkspace.org/code/2e73a02fa3b411ea59179979cdd04fe6
Отбрасывает все то, что после "0123", как я и говорил.
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
26.01.2012, 14:18 #22
Цитата Сообщение от zelim Посмотреть сообщение
Типичный пример того, как функция sizeof откидывает "мусор".
Так и любые другие функции при чтении массива ищут нуль-символ.
Сайзоф не ищет нуль-символ, да и функцию можно сделать также.
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.01.2012, 14:19 #23
Цитата Сообщение от zelim Посмотреть сообщение
Отбрасывает все то, что после "0123", как я и говорил.
Дак вы же про sizeof говорили, мол она по нуль-терминанте высчитывает размер.
0
Teravisor
31 / 31 / 2
Регистрация: 07.08.2011
Сообщений: 89
26.01.2012, 14:20 #24
http://liveworkspace.org/code/7741b08725f73e86fbe0c0250b012582

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

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

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

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

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



См. мою ссылку. Там sizeof выдает 12 - почему?
Понятно. Спасибо за пояснение.
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.01.2012, 14:50 #33
Цитата Сообщение от zelim Посмотреть сообщение
правда в первом примере, вроде пост 15, который удалили, sizeof все-таки неправильно посчитал вроде бы).
Там была не нуль-терминанта, а \056. Пробел просто не поставил.
0
go
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.01.2012, 14:55 #34
Цитата Сообщение от zelim Посмотреть сообщение
значение '\0' - функции вида printf будут выдавать "01", считая "34" мусором. Я это подразумевал.
Мусор, это то, что находится по адресу, большему(или равному) чем
C++
1
s + sizeof(s);
0
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));
0
Teravisor
31 / 31 / 2
Регистрация: 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.
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.01.2012, 15:05 #37
Цитата Сообщение от Fusix Посмотреть сообщение
Да все верно, я тогда указатели испрользовал. Вот:
И? Выводит sizeof(char*), как я и сказал в посте #31

Замените s[2] = 0x00; на s[0] = 0x00; и увидите, что sizeof никоим образом не зависит от расположения нуль-терминанты
0
26.01.2012, 15:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2012, 15:05

Как выглядит расшифровка Des?
Помогите разобраться с расшифровкой, вот цитата из вики: . А в книги пишут что,...

Как выглядит string в памяти?
Задался вопросом как вы глядит стринг в памяти? С чаром все понятно, а стринг?...

Как выглядит код грамматики Хомского?
Как выглядит код грамматики Хомского?


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru