Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: memcpy() скопировать одну структуру в другую
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Метценгерштейн
есть две структуры и два их объекта:
Код
typedef struct
{
    uint16_t     addr;
    const char ttt;
        uint8_t      var1;
} struct1_t;
struct1_t tmp_struct;

typedef struct
{
    uint8_t     addr;
    uint8_t    arr[10];
} struct2_t;

struct2_t *tx_struct;


т.е. структура 1-я- это набор разного всего, но sizeof(tmp_struct) возвращает, допустим, 7 байт.

мне надо скопировать tmp_struct в tx_struct, но начиная с поля arr.

Я воспользовался
memcpy (tx_struct->arr, &tmp_struct, sizeof(tmp_struct));

корректно?

Ошибок компилятор не выдает, но при старте программы, туда заходит и там зависает.

В чем может быть дело?
aiwa
struct2_t *tx_struct; - не инициализирован.
Владивольт
Код
struct2_t *tx_struct;

tx_struct -- объявлен как указатель.
Проинициализирован ли?
Указывает ли на подготовленную для приёма область памяти?
novikovfb
1. Надо посмотреть оба адреса (tx_struct->arr и &tmp_struct), насколько они допустимы, например - вывести их в трассировочную печать.
2. А другие функции из стандартных библиотек работают корректно? С ARM из-за не указания линкеру типа процессора может получиться такой казус: компилятор генерирует рабочий код (он знает правильный тип процессора), а линкер берет неправильные библиотеки (от процессора, указанного по умолчанию).
Метценгерштейн
нет, не проинициализирован.
Что значит, указывает, ли на подготовленную область?

Я т.о.
Код
struct2_t *tx_struct;


создал объект структуры, куда хочу скопировать данные.

Почему я его еще должен инициализировать?
инициализировать, т.е. записать значения?
Эдди
Цитата(Метценгерштейн @ Mar 27 2017, 20:14) *
создал объект структуры, куда хочу скопировать данные.

Это — просто объявление указателя, память под него не выделяется. Сначала ее malloc'ом надо выделить (либо создать на стеке, заменив указатель на объявление структуры).
Этот код должен падать с сегфолтом, а еще компилятор вовсю должен ругаться!
Советую -Wall -Werror -Wextra в CFLAGS писать — в этом случае не будет соблазна варнинги пропустить.
aiwa
Цитата(Метценгерштейн @ Mar 27 2017, 19:14) *
Я т.о.
Код
struct2_t *tx_struct;

создал объект структуры, куда хочу скопировать данные.


Нет, запись
struct2_t *tx_struct;
означает, что компилятор создает объект в памяти размером в 4-байта (для 32-х) именованный tx_struct. и считает что в нем содержится адрес
на структуру типа 'struct2_t' и пока что он показывает на нулевые либо на совершенно случайные ячейки памяти;
Проинициализировать - это значит записать в него адрес конкретного участка памяти.

tx_struct = new struct2_t;

или

struct2_t struct_in_memory;

tx_struct = &struct_in_memory;

des333
Нужно немного почитать, хотя бы K&R.
Иначе будет тяжеловато.

P.S. Хотя ТС в соседней теме пишет, что Си знает неплохо. Тогда я чего-то недопонимаю...
zltigo
Цитата(des333 @ Mar 27 2017, 19:41) *
P.S. Хотя ТС в соседней теме пишет, что Си знает неплохо. Тогда я чего-то недопонимаю...

Что "знает" продемонстрировано в полный рост sad.gif. K&R второе издание читать обязательно.
Метценгерштейн
ну вот в этом месте оказался слабоват, признаю ))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.