Сейчас на форуме: (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Срока в массиве. Как найти?
Посл.ответ Сообщение

Ранг: 12.8 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 27 мая 2014 10:54 · Поправил: SaNTa76
· Личное сообщение · #1

Вопрос по размеру и хранению в памяти данных:
Code:
  1. char str[] = {'P','A','S','S','\0'};
  2. char str2[] = "Pass\0";
  3. printf("Memory size (%s) is: %i\n", str2, sizeof str);
  4. printf("Memory size (%s) is: %i\n", str2, sizeof str2);

В первом случае str покажет 5 байт - тут понятно. 4 символа и нуль-терминал.
Во втором случае покажет 6. Почему?
Второй вопрос. Если посмотреть в HEX редакторе как хранятся строка (str2) и первый массив (str) , то строка так и будет хранится в прямом виде, а массив разделен тремя байтами C6, 45, F1. Тогда получается первый массив в реальности занимает больший объем чем строка?

Ну и вопрос по поиску строк оформленных первым способом. Как в той же ольге или hexе правильно искать такие строки?

ЗЫ. Ну и как исправить заголовок темы? Щас чую начнется стёб




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 мая 2014 11:08
· Личное сообщение · #2

SaNTa76 пишет:
Во втором случае покажет 6. Почему?

Потому что 5 символов забито руками и нуль-терминал, а 5+1=6.

SaNTa76 пишет:
массив разделен тремя байтами C6, 45, F1

Пруф в студию или не было.

И мало кто в здравом уме оформляет строки в виде 1.



Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 27 мая 2014 11:08
· Личное сообщение · #3

Во втором случае покажет 6 потому что у вас лишний null, загляните в память и вам все станет ясно.
1 случай - 50 41 53 53 00 (Используется посимвольная инициализация тут все верно)
2 случай - 50 41 53 53 00 00 (Используется ASCIZ-строка, т.е нуль-терминированная строка, 0 добавляется автоматически)

| Сообщение посчитали полезным: SaNTa76

Ранг: 3.5 (гость), 3thx
Активность: 0.010
Статус: Участник

Создано: 27 мая 2014 12:06 · Поправил: Initial
· Личное сообщение · #4

>>Пруф в студию или не было.
Наверно что-то типа:
C645 F1 50 MOV BYTE PTR SS:[EBP-0F],'P'
C645 F2 61 MOV BYTE PTR SS:[EBP-0E],'a'



Ранг: 12.8 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 27 мая 2014 12:46
· Личное сообщение · #5

Всё! спасибо разобрался
Code:
  1. 01011028  |.  C645 F0 50    MOV BYTE PTR SS:[EBP-10],50
  2. 0101102C  |.  C645 F1 41    MOV BYTE PTR SS:[EBP-F],41
  3. 01011030  |.  C645 F2 53    MOV BYTE PTR SS:[EBP-E],53
  4. 01011034  |.  C645 F3 53    MOV BYTE PTR SS:[EBP-D],53
  5. 01011038  |.  C645 F4 00    MOV BYTE PTR SS:[EBP-C],0

Насчет здравого ума и оформления строки в виде 1... А почему бы и нет... Я как новичек например такую строку не нашел бы в какомнить крякмисе... через "Search for -> All referenced text string"

Но вопрос остается про реальную размерность. Получается sizeof "врет" насчет занимаемой памяти...

P.S. Данные строки из учебника и не являются моим бредом



Ранг: 3.5 (гость), 3thx
Активность: 0.010
Статус: Участник

Создано: 27 мая 2014 12:56 · Поправил: Initial
· Личное сообщение · #6

>>Получается sizeof "врет" насчет занимаемой памяти...
ничего он не врет. Сколько он вернул, столько памяти и занимает переменная.



Ранг: 33.9 (посетитель), 22thx
Активность: 0.030
Статус: Участник

Создано: 27 мая 2014 13:16
· Личное сообщение · #7

SaNTa76 пишет:
char str[] = {'P','A','S','S','\0'};

инициализация массива руками, насколько забили, таким и будет размер

SaNTa76 пишет:
char str2[] = "Pass\0";

это инициализация массива строкой, компилятор записывает в конец "Pass\0" бинарный 0




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 28 мая 2014 01:41
· Личное сообщение · #8

Code:
  1. 01.01011028  |.  C645 F0 50    MOV BYTE PTR SS:[EBP-10],50
  2. 02.0101102C  |.  C645 F1 41    MOV BYTE PTR SS:[EBP-F],41
  3. 03.01011030  |.  C645 F2 53    MOV BYTE PTR SS:[EBP-E],53


Это только мне глаза вырезает ?



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 28 мая 2014 02:08
· Личное сообщение · #9

Dr0p пишет: Это только мне глаза вырезает ?

В меньшей степени чем "срока".

| Сообщение посчитали полезным: sivorog

Ранг: 3.5 (гость), 3thx
Активность: 0.010
Статус: Участник

Создано: 28 мая 2014 11:32
· Личное сообщение · #10

Dr0p, компилер MS так генерит если не включать оптимизацию.
С /O1 (Минимальный размер) будет писать экономнее.
MOV DWORD PTR SS:[EBP-0C],53534150
MOV BYTE PTR SS:[EBP-8],0




Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

Создано: 28 мая 2014 17:54
· Личное сообщение · #11

Initial, экономнее DS

-----
Array[Login..Logout] of Life




Ранг: 3.5 (гость), 3thx
Активность: 0.010
Статус: Участник

Создано: 28 мая 2014 18:33
· Личное сообщение · #12

Kindly, разве?

C645 F1 50 MOV BYTE PTR SS:[EBP-0F],50
3E:C645 F1 50 MOV BYTE PTR DS:[EBP-0F],50
C640 F1 50 MOV BYTE PTR DS:[EAX-0F],50

Если Base это EBP или ESP не нужно префикса переопределения для SS. Он там по умолчанию.



Ранг: 431.7 (мудрец), 391thx
Активность: 0.730.32
Статус: Участник

Создано: 29 мая 2014 03:04 · Поправил: dosprog
· Личное сообщение · #13

Kindly пишет:
Initial, экономнее DS


Автоматические переменные - только в SS.

Для них и генерируется такой код инициализации.
Иначе просто сгенерируется целая строка в DS или в CS.


SaNTa76 пишет:
Ну и вопрос по поиску строк оформленных первым способом. Как в той же ольге или hexе правильно искать такие строки?


Напрашивается поиск в hiew < mov [ebp + ? ] ,50 >. Но это пффф.



| Сообщение посчитали полезным: Kindly

Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 29 мая 2014 08:09
· Личное сообщение · #14

Как вариант искать по маске
Code:
  1. ?? ?? ?? 50 ?? ?? 41 ?? ?? 53 ...





Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 30 мая 2014 21:03
· Личное сообщение · #15

Veliant пишет:
искать по маске


ssf 1.2 + Signature DB (PEiD)




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 03 июня 2014 23:21 · Поправил: Dr0p
· Личное сообщение · #16

dosprog

> Автоматические переменные - только в SS.

Откройте же для себя понятие дефолтных сегментов изучив первый том IA.



Ранг: 431.7 (мудрец), 391thx
Активность: 0.730.32
Статус: Участник

Создано: 04 июня 2014 05:15 · Поправил: dosprog
· Личное сообщение · #17

Dr0p пишет:
Откройте же для себя понятие дефолтных сегментов изучив первый том IA.


[offtop]

Я говорил об особенности генерации кода компилятором.
Если переменная автоматическая, то она размещается в SS.
То-есть, если я хочу разместить её в SS, то её нужно объявить автоматической.
Специально, чтобы не расходовать память.

Например,

{auto int a = 5;...} - автоматическая, <auto> можно не указывать.
Разместится в стеке при выполнении, при входе в блок {} и инициализируется числом 5.
Как и в рассматриваемом здесь случае со строкой.

{static int a = 5;...} - статическая, <static> требуется указать.
Разместится в коде (может, если <const>) или в данных на этапе компиляции и тогда же проинициализируется значением 5.

[/offtop]




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 04 июня 2014 10:06
· Личное сообщение · #18

dosprog
Он на си только винду изучает. При этом, наверное, соседи жалуются на изрядный мат

-----
IZ.RU



 eXeL@B —› Вопросы новичков —› Срока в массиве. Как найти?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати