Хрестоматия по программированию на Си в Unix


Мобильность и машинная зависимость программ. Проблемы с русскими буквами. - стр. 3


int x = f((long) 666, "good bye" );

то x получит непредсказуемое значение. Если же f описана как void, то написанный оператор заставит компилятор сообщить об ошибке.

Тип (void *) означает указатель на что угодно (понятно, что к такому указателю операции [], *, -> неприменимы: сначала следует явно привести указатель к содержательному типу "указатель на тип"). В частности, сейчас стало принято считать, что функция динамического выделения памяти (memory allocation) malloc() (которая отводит в куче область памяти заказанного размера и выдает указатель на нее) имеет прототип:

void *malloc(unsigned size); /* size байт */ char *s = (char *) malloc( strlen(buf)+1 ); struct ST *p = (struct ST *) malloc( sizeof(struct ST)); /* или sizeof(*p) */

хотя раньше принято было char *malloc();

Поговорим про оператор sizeof. Отметим распространенную ошибку, когда sizeof принимают за функцию. Это не так! sizeof вычисляется компилятором при трансляции

программы, а не программой во время выполнения. Пусть

char a[] = "abcdefg"; char *b = "hijklmn";

Тогда

sizeof(a) есть 8 (байт \0 на конце - считается) sizeof(b) есть 2 на PDP-11 (размер указателя) strlen(a) есть 7 strlen(b) есть 7

Если мы сделаем

b = "This ia a new line"; strcpy(a, "abc");

то все равно

sizeof(b) останется равно 2 sizeof(a) 8

Таким образом sizeof выдает количество зарезервированной для переменной памяти (в байтах), независимо от текущего ее содержимого.

Операция sizeof применима даже к выражениям. В этом случае она сообщает нам, каков будет размер у результата этого выражения. Само выражение при этом не вычисляется, так в

double f(){ printf( "Hi!\n"); return 12.34; } main(){ int x = 2; long y = 4; printf( "%u\n", sizeof(x + y + f())); }

будет напечатано значение, совпадающее с sizeof(double), а фраза "Hi!" не будет напечатана.

Когда оператор sizeof применяется к переменной (а не к имени типа), можно не писать круглые скобки:




- Начало -  - Назад -  - Вперед -



Книжный магазин