![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8s5NTLR56mYUb0IIixhstWacJVUkR44q2ZvIBsZBh8h4YV5ja5LSVGspA4x59uX_dqjiw4cpB86afO2Ez_AZ0Z6QEyCy-svREFaMJ1AlIYXpQFQMDEXD3LHC7chPa1W41Og-jGE9_Kmg/s400/objCharArray+memory.png)
В окне просмотра памяти находится область &objCharArray = 0x0012FF1C. Виден блок не инициализированной памяти – несколько строк с 0xCC. Это массив x[24]. Чтобы убедится, запишем в него слово и проверим в дебаггере еще раз.
#include <stdio.h>
#include <Windows.h>
class CCharArray
{
char x[24];
public:
CCharArray()
{
strcpy(x, "Hello");
}
void method()
{
printf("method\r\n");
}
};
int main()
{
CInt objInt;
printf("size of CInt object is %d\r\n", sizeof(objInt));
CDouble objDouble;
printf("size of CDouble object is %d\r\n", sizeof(objDouble));
CChar objChar;
printf("size of CChar object is %d\r\n", sizeof(objChar));
CCharArray objCharArray;
printf("size of CCharArray object is %d\r\n", sizeof(objCharArray));
return 0;
}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioXP-vwJmnmsubYBNsLBXBbGUiL8xLMf8Nzie_36HK_pVOTFFTGkV5nQt7TtAJFjbMxHmbsow6gNPu_yjWgZKTEJ0IJ39bI35TYhULlQSkG8939qmGK8nbKMY1zlWKWJFz-soI7TKf3vU/s400/objCharArray+constructor+memory.png)
“Hello” записано в начале памяти отведенной для объекта objCharArray.
Студия находит внутренние переменные и показывает их. А это и не сложно. Вот программа, которая имеет "ошибку" (printf получил параметром класс вместо "ожидаемого" числа целого типа) и тоже показывает скрытые переменные класса:
#include <stdio.h>
#include <Windows.h>
class CInt
{
int x;
public:
CInt() : x(123) {}
};
class CCharArray
{
char x[24];
public:
CCharArray()
{
strcpy(x, "Hello");
}
};
int main()
{
CInt objInt;
printf("size of CInt object is %d\r\n", sizeof(objInt));
printf("CInt as integer %d\r\n", &objInt);
CCharArray objCharArray;
printf("size of CCharArray object is %d\r\n", sizeof(objCharArray));
printf("CCharArray as string is %s\r\n", &objCharArray);
return 0;
}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPes1ApWXzQf8uoHjjLhsw6sMik0fz2g8F9OT22OFvpzMSyXCyVjAJW3eNytMzrQOa4qX1VQfAUzlnDiFEasYrcO0YCfnjdejHe38AHcbUWIMYwiaO-4VXh55-IJGjsI2RhUifVjGRP6o/s400/private+printed.png)
А ведь стандартный С++ говорит, что это private переменная и доступа к ней нет.
А вот так вторую и третью переменные из класса вывести на экран можна:
#include <stdio.h>
#include <Windows.h>
class CInt
{
int x;
int y;
int z;
public:
CInt() : x(123), y(456), z(789) {}
};
int main()
{
CInt objInt;
printf("size of CInt object is %d\r\n", sizeof(objInt));
printf("CInt: first private member %d\r\n", objInt);
printf("CInt: second private member %d\r\n", *((int*)&objInt + 1));
printf("CInt: third private member %d\r\n", *((int*)&objInt + 2));
return 0;
}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhChPuwf_22ZgVtUgcOAAQ0kxrFT0ASNURgm1Zv7LoQ2HL_B9OFjan8oFC6tstMqfc8XPu0nFC_e1ZVJJfWsBpjoZ44QymzwQZf9MH20Z9qHWjFUz5mcR2mjY5M70bH2ZQRbzluf-q4F2o/s400/3+private+printed.png)
No comments:
Post a Comment