Я новичок в C. Я увидел эту строку в программе:Что означает sizeof (int **)?
grid = calloc(nx,sizeof(int**));
я прочитал, что int**
означает указатель на указатель, но что подразумевается под sizeof(int**)
??
Я новичок в C. Я увидел эту строку в программе:Что означает sizeof (int **)?
grid = calloc(nx,sizeof(int**));
я прочитал, что int**
означает указатель на указатель, но что подразумевается под sizeof(int**)
??
sizeof(int **)
показывает, сколько байтов в int **
есть, аналогично тому, как sizeof(int *)
говорит вам, какое количество байт int *
есть. У них просто разные уровни косвенности.
Правильно ли сказать, что sizeof (int **) = sizeof (int *), поскольку в обоих случаях нам нужно только поместить адрес в память. Кроме того, не имеет значения, если вы поместили пробел между int и **? Спасибо за помощь – secluded
@secluded: Нет. Не гарантируется, что 'int *' и 'int **' требуют того же объема памяти. На большинстве современных архитектур они делают, но это не должно быть повсеместно истинным. –
На практике, скорее всего, однако это не обязательно должно быть так. Стандарт не говорит, что они должны быть одинаковыми. – dbush
Выражение sizeof
- это просто количество байтов, необходимых для представления указателя на указатель на int
. Предположительно, тот, кто написал код, хочет выделить достаточно памяти для хранения nx
таких указателей.
Оператор sizeof
дает количество байтов хранения, необходимых для его операнда. Операнд является выражением или типом, заключенным в круглые скобки. В этом случае операндом является тип int **
, который является «указателем на указатель на int
».
Предполагая grid
был объявлен
int ***grid;
то, что можно переписать в виде
grid = calloc(nx, sizeof *grid);
Nit: "* .. в этом случае операндом является тип 'int **' * "На самом деле, поскольку его тип должен быть размером, должен быть операнд' (int **) '. – alk
Спасибо за ответ! Как вы пришли к выводу, что 'grid' должен быть объявлен как' int *** grid' ?? Я бы очень признателен, если бы вы могли объяснить, что означает это заявление. Вы правы, я нашел это заявление в своем коде! – secluded
@secluded: каждый раз, когда вы динамически выделяете объект типа 'T' через' malloc' или 'calloc', вы всегда назначаете полученный указатель объекту типа' T * '. Если вы выделяете блок 'int', вы присваиваете результат 'int *'. Если вы выделяете блок 'int *', вы присваиваете результат 'int **'. И если вы выделяете блок 'int **' s, вы назначаете результат 'int ***'. –
[было это так жестко?] (Https://en.wikipedia.org/wiki/Sizeof) –
@EOF благодарим вас за добавление развлечений в мой день. –
@EOF: «* ... предполагает, что NULL должен быть побитовым. *« Из чего вы заключаете это? Что мне не хватает? : -S – alk