Я хочу создать функцию, которая получает пустой указатель. Этот указатель указывает на произвольные пользовательские данные. Это сейчас не актуально. Важнее дескриптор, описывающий эти пользовательские данные. Он находится под этими данными. Я хочу получить его адрес, есть два разных решения:
struct data_desc {
size_t size;
data_type_t type;
/* And so on... */
};
/* Operate on the descriptor */
void operate_on_data(void *ptr)
{
struct data_desc *desc;
/* Now I want to get the desc /*
/* This is the first approach, simply fails */
desc = ((struct data_desc *)ptr) - sizeof(struct data_desc);
/* This is the second, it works...*/
desc = (struct data_desc *)ptr;
desc--;
/* Do something with desc */
}
Как видите, я использую два разных подхода для получения адреса дескриптора. Я думал, что первое более естественно, но оно просто не работает. Я использовал больше круглых скобок, чтобы избежать проблем с приоритетом.
Я знаю, что эти методы небезопасны. Первый вариант не работает, почему? В чем причина такого поведения?
Заранее спасибо!