значения хранятся в структуре

я новичок в языке C. У меня есть несколько вопросов относительно структур.

Например:

static inline void *mmc_priv(struct mmc_host *host)
{        
     return (void *)host->private;
}

struct mmc_host 
{
    unsigned long private[0] ____cacheline_aligned;
};


struct mmc_davinci_host *host = NULL;
struct mmc_host *mmc = NULL;

host = mmc_priv(mmc);
host->mmc = mmc;

* struct mmc_davinci_host см. на этом сайте http://lxr.free-electrons.com/source/drivers/mmc/host/davinci_mmc.c#L167*

Функция mmc_priv() возвращает пустой указатель. Итак, где host хранит возвращенный адрес, поскольку host является структурным типом?

Спасибо.


person space boy    schedule 20.10.2011    source источник


Ответы (1)


Возврат void* не означает возврата указателя void. Это означает вернуть указатель на любой тип.
На самом деле указатели хранят адреса, а адреса всегда имеют одинаковый размер, независимо от того, какой тип находится позади.

Однако у вас должно быть приведение к struct mmc_davinci_host * после вызова mmc_priv. Я бы написал это следующим образом:

/* call mmc_priv and store its result in host, after having cast it to struct mmc_davinci_host * */
host = (struct mmc_davinci_host *) mmc_priv(mmc);
person jopasserat    schedule 20.10.2011
comment
Да. Я понимаю, что void* предназначен для приведения к любому типу. Но поскольку структура имеет свои собственные объявленные члены. Где находится хранилище адресов? Это 1-й байт struct?? - person space boy; 20.10.2011
comment
host - это указатель, а не struct напрямую. Он указывает на struct, где находятся участники. - person jopasserat; 20.10.2011
comment
оккк. Я это уже понял. Я скучаю по тому хосту, который является указателем. Спасибо, что указали на него. У вас есть хорошая электронная книга / сайт для изучения C? - person space boy; 20.10.2011
comment
@spaceboy: список электронных книг см. по этой ссылке на SO и эта ссылка на SO для книг по программированию на C - person another.anon.coward; 20.10.2011
comment
Преобразование из void* можно выполнить неявно; актерский состав не нужен. - person Keith Thompson; 20.10.2011
comment
@spaceboy: посмотри ссылку на электронные книги, которую указал другой.anon.coward - person jopasserat; 20.10.2011
comment
@ Кейт Томпсон: конечно, это неявно. Однако многословие всегда лучше в программной инженерии. Чем чище код, тем лучше. - person jopasserat; 20.10.2011
comment
@jHackTheRipper: Не всегда. Например, приведение может маскировать отказ от включения объявления для mmc_priv, что (до C99) заставляет компилятор предположить, что он возвращает int. C имеет неявные преобразования по какой-то причине. - person Keith Thompson; 20.10.2011
comment
@Keith Thomspon: вот почему это не самый безопасный язык! Но я бы посоветовал каждому программисту добавить эти явные приведения вместе с комментарием, чтобы в случае сбоя это могло быть подсказкой для отладки. - person jopasserat; 20.10.2011
comment
@jHackTheRipper: приведения ничего не добавляют к функциональности или безопасности программы. - person Keith Thompson; 20.10.2011