Метценгерштейн 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба есть две структуры и два их объекта: 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 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба struct2_t *tx_struct; - не инициализирован. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladivolt 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба struct2_t *tx_struct; tx_struct -- объявлен как указатель. Проинициализирован ли? Указывает ли на подготовленную для приёма область памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба 1. Надо посмотреть оба адреса (tx_struct->arr и &tmp_struct), насколько они допустимы, например - вывести их в трассировочную печать. 2. А другие функции из стандартных библиотек работают корректно? С ARM из-за не указания линкеру типа процессора может получиться такой казус: компилятор генерирует рабочий код (он знает правильный тип процессора), а линкер берет неправильные библиотеки (от процессора, указанного по умолчанию). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба нет, не проинициализирован. Что значит, указывает, ли на подготовленную область? Я т.о. struct2_t *tx_struct; создал объект структуры, куда хочу скопировать данные. Почему я его еще должен инициализировать? инициализировать, т.е. записать значения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба создал объект структуры, куда хочу скопировать данные. Это — просто объявление указателя, память под него не выделяется. Сначала ее malloc'ом надо выделить (либо создать на стеке, заменив указатель на объявление структуры). Этот код должен падать с сегфолтом, а еще компилятор вовсю должен ругаться! Советую -Wall -Werror -Wextra в CFLAGS писать — в этом случае не будет соблазна варнинги пропустить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Я т.о. 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 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Нужно немного почитать, хотя бы K&R. Иначе будет тяжеловато. P.S. Хотя ТС в соседней теме пишет, что Си знает неплохо. Тогда я чего-то недопонимаю... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба P.S. Хотя ТС в соседней теме пишет, что Си знает неплохо. Тогда я чего-то недопонимаю... Что "знает" продемонстрировано в полный рост :(. K&R второе издание читать обязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба ну вот в этом месте оказался слабоват, признаю )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться