LINUX.ORG.RU

История изменений

Исправление Norong, (текущая версия) :

Я увидел ситуацию так: t[p->count] - это void***, указатель на void**, указатель на указатель на нулевой элемент массива из void*.

В этом коде

t = *((void ***) t[p->count]);

происходит следующее: я обозначаю, что t[p->count] - это void*** (потому что иначе компилятор бы подумал, что это лишь void*), при разыменовании компилятор начинает с самого «глубокого» уровня, и как указатель трактуется тот самый нулевой элемент массива из void*. В итоге, то, на что он указывает, записывается в t, а указывает он непонятно куда.

В этом коде:

t = (void **) t[p->count];

по-видимому, приведение к типу void** оставляет два «последних» уровня указателей, отбрасывая один «верхний»: от t[p->count] остаётся void**: указатель на нулевой элемент массива из void*. Его я присваиваю t, всё хорошо.

В этом коде:

t = *((void ***) &t[p->count]);

операция & даёт мне адрес t[p->count] (это void****), но я плохо понимаю, что получается из приведения получившегося к типу void***. Если верно моё предположение о том, что приведение к void с меньшим числом звёздочек оставляет последние уровни указателей, то от приведения к void*** должно получится то же t[p->count] что и было.

Похоже, моё понимание происходящего несовершенно. Не мог бы ты его подкорректировать, если тебе не сложно?

Исправление Norong, :

Я увидел ситуацию так: t[p->count] - это void***, указатель на void**, указатель на указатель на нулевой элемент массива из void*.

В этом коде

t = *((void ***) t[p->count]);

происходит следующее: я обозначаю, что t[p->count] - это void*** (потому что иначе компилятор бы подумал, что это лишь void*), при разыменовании компилятор начинает с самого «глубокого» уровня, и как указатель трактуется тот самый нулевой элемент массива из void*. В итоге, то, на что он указывает, записывается в t, а указывает он непонятно куда.

В этом коде:

t = (void **) t[p->count];

по-видимому, приведение к типу void** оставляет два «последних» уровня указателей, отбрасывая один «верхний»: от t[p->count] остаётся void**: указатель на нулевой элемент массива из void*. Его я присваиваю t, всё хорошо.

В этом коде:

t = *((void ***) &t[p->count]);

операция & даёт мне адрес t[p->count] (это void****), но я плохо понимаю, что получается из приведения получившегося к типу void***. Если верно моё предположение о том, что приведение к void с меньшим числом звёздочек оставляет последние уровни указателей, то от приведения к void*** должно получится то же t[p->count] что и было.

Похоже, моя картина происходящего несовершенна. Не мог бы ты её подкорректировать, если тебе не сложно?

Исходная версия Norong, :

Я увидел ситуацию так: t[p->count] - это void***, указатель на void**, указатель на указатель на нулевой элемент массива из void*.

В этом коде

t = *((void ***) t[p->count]);

происходит следующее: я обозначаю, что t[p->count] - это void*** (потому что иначе компилятор бы подумал, что это лишь void*), при разыменовании компилятор начинает с самого «глубокого» уровня, и как указатель трактуется тот самый нулевой элемент массива из void*. В итоге, то, на что он указывает, записывается в t, а указывает он непонятно куда.

В этом коде:

t = (void **) t[p->count];

по-видимому, приведение к типу void** оставляет два «последних» уровня указателей, отбрасывая один «верхний»: от t[p->count] остаётся void**: указатель на нулевой элемент массива из void*. Его я присваиваю t, всё хорошо.

В этом коде:

t = *((void ***) &t[p->count]);

операция & даёт мне адрес t[p->count] (это void****), но я плохо понимаю, что получается из приведения получившегося к типу void***. Если верно моё предположение о том, что приведение к void с меньшим числом звёздочек оставляет последние уровни указателей, то от приведения к void*** должно получится то же t[p->count] что и было.