понедельник, 6 апреля 2009 г.

Думал, что мир перевернулся...

Сидел на лекции, баловался.. В итоге вышло, что заработал данный кусок кода (но только в релиз варианте, дебаг перехватывает обращения к неициализированному поинтеру):

class A {
public:
int a;
bool b;
float c;
void debug() { printf("%i %s %f\r\n", a, b ? "true" : "false", c); }
};

int main() {
A * f; // <-- ??? f->a = 4;
f->b = true;
f->c = 4.5f;
f->debug();
return 0;
}

Дальше в лес, больше дров, мой товарищ решил совсем извратиться :))

float* f;
int i;
for (i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}
Так работает, но после определенного числа итераций валится.

А след. кусок валится сразу (если int i обьявить в конструкции for).
float* f;
for (int i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}

Обьяснение приблизительно следующее: в релиз варианте поинтер забивается дефолтным мусором (принцип его формирования нам остался неизвестным), но если из этого мусора сделать поинтер, то он будет указывать на доступную область памяти, в эту память можно писать. Так как нам все же доступно не все адресное пространство - то на определенном числе итерации оно валится..