Явное приведение типов - PullRequest
0 голосов
/ 02 июня 2010

Я прочитал в книге, которая определяет это:

//: C03:SimpleCast.cpp
int main() {
int b = 200;
unsigned long a = (unsigned long int)b;
} ///:~

"Чтение является мощным, но оно может вызвать головную боль, потому что в некоторых ситуации это заставляет компилятор обрабатывать данные, как если бы например) больше, чем на самом деле, поэтому он будет занимать больше места в объем памяти; это может растоптать другие данные. Это обычно происходит при приведении указателей, а не при выполнении простых приведений типа показано выше. "

Теперь вы можете привести пример, когда указатель приведения может растоптать другие данные?

Ответы [ 4 ]

5 голосов
/ 02 июня 2010
int main(void)
{
    short int a = 5;
    short int b = 7;
    *(long int*)&a = 0;
}

Предполагая sizeof(long) > sizeof(short) и допуская, что компилятор помещает a в стек до того, как b, b будет уничтожено.

1 голос
/ 02 июня 2010
int main() { 
    char a[] = "This is a string.";

    *(long *)a = 12345678;  // will typically overwrite first four or eight bytes of a.

    std::cout << a;
    return 0;
}
0 голосов
/ 03 июня 2010

Поскольку это было помечено как C ++, а не C, я также рекомендую прочитать о приведениях в стиле C ++ относительно приведений в стиле C:

static_cast<Derived *>(pBase)->DMethod();
if (dynamic_cast<Derived *>(pBase)) dynamic_cast<Derived *>(pBase)->DMethod();
const_cast<CRect &>(constRect).x = 3;
int *pInt = reinterpret_cast<int *>(charbuff);

Я настоятельно рекомендую книгу Скотта Майера «Эффективный C ++, 55 конкретных способов улучшить ваши программы и разработки», 3-е издание, которая очень хорошо объясняет это. Удостоверьтесь, что вы получаете 3-е издание, хотя во 2-м издании также могут быть представлены приведения в стиле C ++.

По сути, если вы используете C ++ и ваш компилятор был написан в течение последних 10 лет, НИКОГДА не используйте приведение в стиле C. Используйте приведения в стиле C ++.

0 голосов
/ 02 июня 2010
char unix[5]="unix";
char* first= &(unix[0]);
int * intptr= (int*) first;
*first=64;
printf("%s\n",unix); /* prints @ /*
...