memset или bzero гарантируют, что указатель поля в структуре будет обнулен?

Предположим, у вас есть класс Coo F ++, и вы говорите:

Foo* foos = new Foo[SOME_CONSTANT];
memset(foos, 0, sizeof(Foo)*SOME_CONSTANT);
//or the bzero equivalent

и что Foo имеет член данных Bar* barPtr, Будет ли вышеуказанная операция гарантировать, что
barPtr будет NULL? (то есть ноль). Я столкнулся с делом в GDB, где это не относится к memset, и мне любопытно, почему.

Я знаю, что вышеизложенное, вероятно, плохая практика, но я прошу любопытства.

Я понял, что у меня был дополнительный , я делал sizeof (Foo) * SOME_CONSTANT в memset …

3

Решение

С одной стороны, это определяется реализацией. memset или же bzero заполнит значение указателя битовым шаблоном со всеми нулями, который не обязательно является физическим представлением нулевого указателя на данной платформе. Даже не гарантируется получение правильного значения указателя, что означает, что вы можете получить так называемое представление ловушки, который вызывает неопределенное поведение при доступе.

С другой стороны, bzero является (или раньше) частью спецификации POSIX. Если память служит, POSIX требует (или, по крайней мере, использует), чтобы нулевые указатели были представлены шаблоном с нулевыми битами, что означает, что в системах POSIX он действительно установит указатель на ноль.

Но опять же, гарантия, предоставленная POSIX, является лишь примером специфического для реализации свойства, упомянутого в первой части моего ответа. Язык (C или C ++) не предоставляет таких гарантий.

3

Другие решения

Нет. Представление нулевого указателя не обязательно должно быть равным нулю.

Увидеть раздел 5 а также вопрос 7.31 из comp.lang.c FAQ.

3

По вопросам рекламы [email protected]