2016-09-09 8 views
-4

Есть ли способ добавить смещение ко всем элементам структуры за один раз.Добавление смещения ко всем элементам в структуре

#include <stdio.h> 

struct date {   /* global definition of type date */ 
    int month; 
    int day; 
    int year; 
}; 

main() 
{ 

    struct date today; 

    today.month = 10; 
    today.day = 14; 
    today.year = 1995; 

    //I want to add 2 to month/day/year. 
    today.month += 2; 
    today.day += 2; 
    today.year += 2; 

    printf("Todays date is %d/%d/%d.\n", \ 
     today.month, today.day, today.year); 
} 
+0

И в чем проблема? – Olaf

+0

Я хотел знать, как лучше установить значения всех элементов в структуре, а не устанавливать их индивидуально. – user968000

+0

Включите его в функцию и передайте аргумент? –

ответ

2

Хорошо, позвольте мне начать с отказа от ответственности: это определенно плохой стиль, и я не знаю, почему вы хотели бы это сделать.

Ключевые моменты:

  1. Это работает только, если все элементы в структуры одного и того же типа
  2. Это будет работать для любого числа атрибутов одного и того же типа в структуры
  3. Это может не работает вообще из-за заполнения между членами. Я сомневаюсь, что это возможно, но это не гарантируется стандартом C.
  4. Почему бы просто не сделать способ для этого?
  5. Я упоминал, что это плохой стиль?

Весело:

#include <stdio.h> 
    #include <assert.h> 

    struct date { 
     int month; 
     int day; 
     int year; 
    }; 


    int main() { 
     struct date d; 
     d.month = 10; 
     d.day = 14; 
     d.year = 1995; 
     printf("Before\n\tm: %d, d: %d, y: %d\n", d.month, d.day, d.year); 
     size_t numAttributes = 3; 
     assert(sizeof(struct date) == numAttributes*sizeof(int)); 
     for(int i = 0; i < numAttributes; ++i) { 
      int *curr = (int *)((char *)&d + i*sizeof(int)); // memory address of current attribute. 
      *curr += 2;             // how much you want to change the element 
     } 
     printf("After\n\m: %d, d: %d, y: %d\n", d.month, d.day, d.year); 
     return 0; 

Выход:

Before 
    Month: 10, Day: 14, Year: 1995 
After 
    Month: 12, Day: 16, Year: 1997 

Тщательно вымойте руки после того, как вы закончите.

+0

Может существовать пробел между членами 'struct', чтобы быть переносимым, вам нужно вычислить' offsetof' каждого члена, как вы это делаете с 'month' –

+0

@AlterMann. Если бы они не были дополнением, такой же тип нет? – gowrath

+0

Это маловероятно, но C не гарантирует его: 6.7.2.1 (15): указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный член (или если этот элемент является битовым полем, а затем единицам, в которых он находится), и наоборот. ** В структурном объекте может быть неназванное заполнение, но не в начале. Каждый член, не являющийся битовым полем структуры или объекта объединения, выровнен по определенному режиму, соответствующему его типу. ** –

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