2016-07-12 2 views
1

Я новичок в C. Я увидел эту строку в программе:Что означает sizeof (int **)?

grid = calloc(nx,sizeof(int**)); 

я прочитал, что int** означает указатель на указатель, но что подразумевается под sizeof(int**) ??

+3

[было это так жестко?] (Https://en.wikipedia.org/wiki/Sizeof) –

+0

@EOF благодарим вас за добавление развлечений в мой день. –

+0

@EOF: «* ... предполагает, что NULL должен быть побитовым. *« Из чего вы заключаете это? Что мне не хватает? : -S – alk

ответ

1

sizeof(int **) показывает, сколько байтов в int ** есть, аналогично тому, как sizeof(int *) говорит вам, какое количество байт int * есть. У них просто разные уровни косвенности.

+0

Правильно ли сказать, что sizeof (int **) = sizeof (int *), поскольку в обоих случаях нам нужно только поместить адрес в память. Кроме того, не имеет значения, если вы поместили пробел между int и **? Спасибо за помощь – secluded

+3

@secluded: Нет. Не гарантируется, что 'int *' и 'int **' требуют того же объема памяти. На большинстве современных архитектур они делают, но это не должно быть повсеместно истинным. –

+2

На практике, скорее всего, однако это не обязательно должно быть так. Стандарт не говорит, что они должны быть одинаковыми. – dbush

2

Выражение sizeof - это просто количество байтов, необходимых для представления указателя на указатель на int. Предположительно, тот, кто написал код, хочет выделить достаточно памяти для хранения nx таких указателей.

3

Оператор sizeof дает количество байтов хранения, необходимых для его операнда. Операнд является выражением или типом, заключенным в круглые скобки. В этом случае операндом является тип int **, который является «указателем на указатель на int».

Предполагая grid был объявлен

int ***grid; 

то, что можно переписать в виде

grid = calloc(nx, sizeof *grid); 
+0

Nit: "* .. в этом случае операндом является тип 'int **' * "На самом деле, поскольку его тип должен быть размером, должен быть операнд' (int **) '. – alk

+0

Спасибо за ответ! Как вы пришли к выводу, что 'grid' должен быть объявлен как' int *** grid' ?? Я бы очень признателен, если бы вы могли объяснить, что означает это заявление. Вы правы, я нашел это заявление в своем коде! – secluded

+1

@secluded: каждый раз, когда вы динамически выделяете объект типа 'T' через' malloc' или 'calloc', вы всегда назначаете полученный указатель объекту типа' T * '. Если вы выделяете блок 'int', вы присваиваете результат 'int *'. Если вы выделяете блок 'int *', вы присваиваете результат 'int **'. И если вы выделяете блок 'int **' s, вы назначаете результат 'int ***'. –

Смежные вопросы