#include <stdio.h>
#include <stdlib.h>
struct someStruct {
int ivar;
char cvar;
float fvar;
};
main(argc,argv)
const char** argv;
{
struct someStruct someObj;
someObj.ivar = 1;
someObj.fvar = 2.3;
someObj.cvar = 'r';
printf("%u\n",&someObj.fvar);
printf("%u\n",(&someObj.cvar + 4));
printf("%f\n",*((&someObj.cvar) + 4));
printf("%f\n",someObj.fvar);
}
Это программа, которую я написал, которая пытается получить доступ к адресу fvar
, добавив 4 к адресу char.Я знаю концепцию вялого байта.Я пытался получить доступ к этой памяти, и вот!он напечатал адрес правильно.
printf("%u\n",&someObj.fvar);
printf("%u\n",(&someObj.cvar + 4));
Оба печатают один и тот же адрес.
Затем я попытался получить доступ к fvar следующим образом:
printf("%f\n",*((&someObj.cvar) + 4));
printf("%f\n",someObj.fvar);
и
0.000000
2.300000
были моими результатами.
Затем я понял, что char * и float * интерпретируются по-разному.
Итак, я попробовал все виды типов: от char * до float * до float, а также от char до float * до floatи это также во всех возможных точках, таких как, например, typecasting the returned address to float
, с использованием 4.0
вместо 4
(который, как я понял, не должен был работать ... и не работал) и т. д.
Он почему-то просто не печатает 2.300000
и продолжает печатать 0.000000
Где я пропускаю концепцию?
Обратите внимание, что у меня есть 64-bit MinGW
и добавляется slack-byte
(Я знаю, что некоторые нет), который я уже подтвердил:
printf("%u",sizeof(someObj.ivar));
printf("%u",sizeof(someObj.fvar));
printf("%u",sizeof(someObj.cvar));
printf("%u",sizeof(someObj));
, что дает 4
, 4
, 1
и 12 ....(sizeof(char) + 3)
соответственно.
PS Я знаю, что это ужасная идея, но именно так я обычно изучаю концепции XD