Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
somwan
2 / 2 / 1
Регистрация: 15.04.2014
Сообщений: 8
#1

Порядок хранения структур в ОЗУ и memset - C++

27.11.2014, 09:37. Просмотров 289. Ответов 5
Метки нет (Все метки)

Всем добра!

Вопрос в следующем. если объявить массив например m[100] - то он будет храниться в ОЗУ как сплошная последовательность символов и для обнуления этого массива можно использовать функцию memset(m, 0, sizeof(m)); А как именно в ОЗУ хранятся структуры? Тоже как сплошная последовательность, или как-то иначе? Цель вопроса состоит в понимании можно ли для обнуления структур использовать функцию memset();
например:
C++
1
2
3
4
5
6
7
8
9
struct STR { 
 
                          unsigned char m[100];
                          long int p1;
                          int p2;
 
} str;
 
    memset(&str, 0, sizeof(STR));
сомнение есть в том, что так можно делать. Потому что непонятно как именно хранятся данные структуры в ОЗУ.

Добавлено через 17 минут
Пожалуй стоит уточнить. Я так делаю, и при проверке вроде бы и работает, но в программе есть непонятный глюк, в участке работающего кода не так уж много, и среди него memset() - используемая как раз для обнуления структуры. Вот и возникло предположение о том что из-за неё глючит. Может кто сталкивался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 09:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Порядок хранения структур в ОЗУ и memset (C++):

Определить порядок хранения байт 16-ричного числа - C++
Всем привет! Имеется следующий вопрос: написать программу, которая показывает порядок хранения байт 16-ричного числа. Как это сделать?

Двунаправленный ассоциативный контейнер для хранения структур - C++
12. Двунаправленный ассоциативный контейнер. Цель: разработать программу, реализующую функционал телефонной книги. Задачи: ...

Разработать программу «Библиотека», в которой для хранения информации о книгах используется массив структур - C++
Разработать программу «Библиотека», в которой для хранения информации о книгах используется массив структур inv_bib. Различные функции...

memset() - C++
Здравсвуйте. У меня возник вопрос касательно memset().Есть код: #include <iostream> #include <memory.h> #include <cstdio> ...

memset - C++
Попробовал потренироватся, как работает функция мемсет. Вот попробовал самый простенький код, но не выдаёт результат 7, хотя все поля ...

memset, memcpy - C++
Использую MSVS 2008. Почему memcpy работает только с char? То есть, такой код работает: int main() { char a1 = "123"; ...

5
Max Dark
шКодер самоучка
1851 / 1651 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
27.11.2014, 09:56 #2
Цитата Сообщение от somwan Посмотреть сообщение
в программе есть непонятный глюк
Выложите код, посмотрим
0
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
27.11.2014, 09:59 #3
В данном случае так можно делать. Структура занимает непрерывный участок памяти. Глюк, очевидно, имеет другую причину.
Приведенный код не дает информации о вероятных причинах глюка.
0
somwan
2 / 2 / 1
Регистрация: 15.04.2014
Сообщений: 8
27.11.2014, 10:08  [ТС] #4
Я не прошу искать эту причину. Я спрашиваю о том как структуры хранятся в ОЗУ, сплошной последовательностью байтов, или же по переменным из состава структуры. Если первое, то memset() пригоден, если второе, то нет. вопрос только в этом. Я уже начинаю склоняться что первый вариант. И уже от многих слышал то же (спасибо CheshireCat). Глюк я и сам выведу, это вопрос времени.
0
demmax2004
60 / 138 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
27.11.2014, 10:11 #5
Цитата Сообщение от somwan Посмотреть сообщение
Тоже как сплошная последовательность
Да, но с выравниванием по границе 4 байта(для x32 систем)

Цитата Сообщение от somwan Посмотреть сообщение
ОЗУ как сплошная последовательность символов
да, но с учетом выравнивания членов структуры.

memset(&str, 0, sizeof(STR));
Все ОК.
0
somwan
2 / 2 / 1
Регистрация: 15.04.2014
Сообщений: 8
27.11.2014, 10:14  [ТС] #6
Ну хорошо, спасибо за обсуждение. Сомнение разрешено.
0
27.11.2014, 10:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2014, 10:14
Привет! Вот еще темы с ответами:

по поводу memset - C++
здравствуйте, есть, допустим, такой код(rtti включен): struct img { virtual void a() = 0; }; struct img_ : public img { ...

Неправильное использование memset - C++
сам столкнулся как-то с такой вещью как неправильное использование memset на чистом си... до этого пользовался им только для обнуления, но...

Memset для двухмерного массива - C++
int g_iArray; memset( g_iArray, 0, sizeof( g_iArray) ); Верно ли ?

Что делает memset в приведенном коде - C++
void replace(char* text, char* word) { char* buffer = new char; strcpy(buffer, text); int pos = strstr(buffer, word) - buffer; ...


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

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

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