Перейти к содержанию
    

memcpy() скопировать одну структуру в другую

есть две структуры и два их объекта:

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));

 

корректно?

 

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

 

В чем может быть дело?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

struct2_t *tx_struct;

tx_struct -- объявлен как указатель.

Проинициализирован ли?

Указывает ли на подготовленную для приёма область памяти?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Надо посмотреть оба адреса (tx_struct->arr и &tmp_struct), насколько они допустимы, например - вывести их в трассировочную печать.

2. А другие функции из стандартных библиотек работают корректно? С ARM из-за не указания линкеру типа процессора может получиться такой казус: компилятор генерирует рабочий код (он знает правильный тип процессора), а линкер берет неправильные библиотеки (от процессора, указанного по умолчанию).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет, не проинициализирован.

Что значит, указывает, ли на подготовленную область?

 

Я т.о.

struct2_t *tx_struct;

 

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

 

Почему я его еще должен инициализировать?

инициализировать, т.е. записать значения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Это — просто объявление указателя, память под него не выделяется. Сначала ее malloc'ом надо выделить (либо создать на стеке, заменив указатель на объявление структуры).

Этот код должен падать с сегфолтом, а еще компилятор вовсю должен ругаться!

Советую -Wall -Werror -Wextra в CFLAGS писать — в этом случае не будет соблазна варнинги пропустить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я т.о.

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;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Иначе будет тяжеловато.

 

P.S. Хотя ТС в соседней теме пишет, что Си знает неплохо. Тогда я чего-то недопонимаю...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. Хотя ТС в соседней теме пишет, что Си знает неплохо. Тогда я чего-то недопонимаю...

Что "знает" продемонстрировано в полный рост :(. K&R второе издание читать обязательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну вот в этом месте оказался слабоват, признаю ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...