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

Работа с void указателем

Сделал такую проверку

void *var_ptr;
uint8_t test1;
uint32_t test2;

test1 = 5;
var_ptr = &test1;
test2 = *((uint32_t *)(var_ptr));

Получаю test2 = 5. Почему результат правильный? Я же привел не к тому типу?

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


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

4 минуты назад, jenya7 сказал:

Получаю test2 = 5. Почему результат правильный? Я же привел не к тому типу?

Потому что повезло что рядом с test1 оказался 0.

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


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

7 minutes ago, jenya7 said:

Получаю test2 = 5. Почему результат правильный? Я же привел не к тому типу?

Натравите на это cppcheck. Должно предупредить о некорректном преобразовании.

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


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

1 hour ago, jcxz said:

Потому что повезло что рядом с test1 оказался 0.

Я тоже так подумал. Усложнил проверку

typedef struct 
{
    uint8_t state;
    uint8_t direction;
    uint8_t prev_direction;
    uint8_t action;
    
    uint8_t flimsw_state;
    uint8_t rlimsw_state;
}MOTOR_RT_PARAMS;


MOTOR_RT_PARAMS mot_rt_params;

mot_rt_params.direction = 5;
mot_rt_params.action = 7;
mot_rt_params.flimsw_state = 8;

uint32_t test;

var_ptr = &mot_rt_params.flimsw_state;
test = *((uint32_t *)var_ptr);

    
 test = *((uint32_t *)var_ptr);

Получаю test = 8.

Изменено пользователем jenya7

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


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

1 hour ago, Arlleex said:

Padding...

Да. Может быть. То есть по любому надо приводить к нужному типу обязательно?

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


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

5 минут назад, jenya7 сказал:

Я тоже так подумал. Усложнил проверку

...

Получаю test = 8.

И что? А сколько там должно быть по вашему?

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


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

1 hour ago, jcxz said:

И что? А сколько там должно быть по вашему?

((uint32_t *)var_ptr) должен взять 4 байта а переменная 1 байт.

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


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

2 минуты назад, jenya7 сказал:

Да. Может быть. То есть по любому надо приводить к нужному типу обязательно?

По-любому вам надо наконец-то начать учить язык си. Обязательно!

1 минуту назад, jenya7 сказал:

((uint32_t *)var_ptr) должен взять 4 байта а переменная 1 байт.

и что? См. моё первое сообщение.

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


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

12 минут назад, jenya7 сказал:

Да. Может быть. То есть по любому надо приводить к нужному типу обязательно?

Не понятна цель экскремента эксперимента... Мусор в переменной получить лишний? Так Вы его получили. Рядом стоящий мусор оказался нулями, как уже было отмечено.

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


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

1 hour ago, Arlleex said:

Не понятна цель экскремента эксперимента... Мусор в переменной получить лишний? Так Вы его получили. Рядом стоящий мусор оказался нулями, как уже было отмечено.

Я хочу передовать войдовый указатель в функцию в качестве аргумента. Хотел 100% быть уверенным что точный каст обязателен.

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


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

1 hour ago, jenya7 said:

Получаю test2 = 5. Почему результат правильный? Я же привел не к тому типу?

Ваше "счастье" определено наличием (?) инициализированной нулями памяти (как выше отмечалось) и "интеловским" порядком  следования байт, по младшему адресу расположен младший байт данных (кажется big-endian). Если этот код откомпилировать для мотороловского процессора (little-endian) - "счастье" не случится.

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


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

21 минуту назад, k155la3 сказал:

Ваше "счастье" определено наличием (?) инициализированной нулями памяти (как выше отмечалось) и "интеловским" порядком  следования байт, по младшему адресу расположен младший байт данных (кажется big-endian). Если этот код откомпилировать для мотороловского процессора (little-endian) - "счастье" не случится.

Да, только LE/BE местами попутаны.

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


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

2 minutes ago, Arlleex said:

Да, только LE/BE местами попутаны.

Да, есть такой грех. диавол такие термины придумал, все запомнить-понять не могу, сено-солома :blush:

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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