2015-04-14 10 views
4

код отлично работает для int, но когда я хочу использовать float, он терпит неудачу, если я не брошу структуру в качестве указателя на символ. Вот как это выглядит:Использование offsetof с поплавком в c

struct test 
{ 
    float a; 
    float b; 
}; 

void stuff(int offset, test* location); 

int main() 
{ 
    test *t; 
    t = (test*)malloc(sizeof(test)); 

    char choice = '\0'; 

    //Find the byte offset of 'a' within the structure 
    int offset; 
    printf("Edit a or b?"); 
    scanf("%c", &choice); 
    switch (toupper(choice)) 
    { 

    case 'A': 
     offset = offsetof(test, a); 
     stuff(offset, t); 
     break; 
    case 'B': 
     offset = offsetof(test, b); 
     stuff(offset, t); 
     break; 
    } 
    printf("%f %f\n", t->a, t->b); 
    return 0; 
} 

void stuff(int offset, test* location) 
{ 
    float imput; 
    printf("What would you like to put in it? "); 
    scanf("%f", &imput); 
    *(float *)((char *)location + offset) = imput; 
    //*(float *)(location + offset) = imput Will Not Work 
} 

*(float *)(location + offset)= imput не будет работать для поплавка, но литье расположения и смещения в качестве указателя Int будет.

Я пробовал смотреть в Интернете, но я не мог найти много о проблеме.

+3

Это не будет работать для Ints. Причина, по которой вам нужно наложить символ 'char *', связана с арифметикой указателя. Когда вы оставите указатель без него, он добавит 'offset * sizeof (test)' к адресу вашего указателя, который вам не нужен. – JS1

+0

Приведенный пример не компилируется. Возможно, отсутствует «typedef» для 'test'. Учитывая это, ни один из ответов не является полезным. –

ответ

5

Это потому, что указатели имеют «единицы», размер объектов, на которые они указывают.

Давайте предположим, что у вас есть указатель p, который указывает, скажем, адрес 1000.

, если у вас есть

int* p = 1000; 
p += 10; 

p укажут 1040 на 32-битных машин, поскольку int имеет размер 4 байта.

Но если у вас есть

char* p = 1000; 
p += 10; 

p укажут 1010.

Вот почему

*(float *)((char *)location + offset) = imput; 

работает, но

*(float *)(location + offset) = imput Will Not Work 

нет.

 Смежные вопросы

  • Нет связанных вопросов^_^