Хорошо, позвольте мне начать с отказа от ответственности: это определенно плохой стиль, и я не знаю, почему вы хотели бы это сделать.
Ключевые моменты:
- Это работает только, если все элементы в структуры одного и того же типа
- Это будет работать для любого числа атрибутов одного и того же типа в структуры
- Это может не работает вообще из-за заполнения между членами. Я сомневаюсь, что это возможно, но это не гарантируется стандартом C.
- Почему бы просто не сделать способ для этого?
- Я упоминал, что это плохой стиль?
Весело:
#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
Тщательно вымойте руки после того, как вы закончите.
И в чем проблема? – Olaf
Я хотел знать, как лучше установить значения всех элементов в структуре, а не устанавливать их индивидуально. – user968000
Включите его в функцию и передайте аргумент? –