В вызове func(&c)
, размер c
меньше sizeof(union foo)
, что может быть опасно, правда?
Правильно, это приведет к неопределенному поведению. dest
, скорее всего, содержит несколько байтов из областей памяти, окружающих c
, и которые зависят от внутренней работы компилятора. Конечно, если вы только получаете доступ к dest.c
, это не должно вызывать проблем в большинстве случаев.
Но позвольте мне быть более конкретным. Согласно стандарту C, запись dest.c
, но чтение dest.i
будет всегда выход неопределенного поведения. Но большинство компиляторов на большинстве платформ также будут иметь четкое поведение для этих случаев. Так часто пишет dest.c
, но чтение dest.i
имеет смысл, несмотря на то, что говорит стандарт. В этом случае, однако, чтение от dest.i
по-прежнему будет зависеть от неизвестных окружающих переменных, поэтому оно не определено не только с точки зрения стандартов, но и в очень практическом смысле.
Существует также редкий сценарий, который вы должны учитывать: c
может быть расположен в самом конце выделенных страниц памяти. (Это относится к страницам памяти, выделенным из операционной системы и, в конечном итоге, к устройству управления памятью (MMU), а не к блочному распределению пространства пользователя, сделанному malloc
и друзьям.) В этом случае чтение более одного байта может привести к доступ к немаркированной памяти и, следовательно, вызывают серьезную ошибку, скорее всего, сбой программы. Учитывая расположение вашего c
в качестве автоматической переменной в главном, это кажется маловероятным, но я полагаю, что этот фрагмент кода является лишь примером.
Является ли линия с memcpy
правильной? А если нет, то как это исправить?
В зависимости от того, что вы хотите сделать. Как бы то ни было, код не имеет особого смысла, поэтому я не знаю, какое правильное разумное приложение вы могли бы иметь в виду.Возможно, вам необходимо передать sizeof
объект src
на номер func
.
этот код не имеет смысла. что ты хочешь делать? –
Memcpy НЕ ДОЛЖЕН. Неопределенное поведение не ограничивается только * письмом * в областях памяти, которые у вас нет. * Доступ к * им ** вообще ** - неопределенное поведение. То, что он может не сбой (и на некоторых платформах он * будет *) не имеет значения. – WhozCraig
@KarolyHorvath Вы имели в виду пример кода ничего полезного? Если это так, это потому, что я только извлек часть, с которой я сомневаюсь. Я добавил немного фона, я не знаю, достаточно ли этого. –