2015-05-17 2 views
2

Обратите внимание, что если a является именем массива, то sizeof(a) даст размер всего массива a, а не размер указателя на один из его элементов.Как `sizeof` отличает указатель от массива?

Так, например, как sizeof различают массив a и указатель b?

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int a[4] = {1, 2, 3, 4}; 
    int *b = a; 
    printf("sizeof\(a) = %ld\n", sizeof(a)); 
    printf("sizeof\(b) = %ld\n", sizeof(b)); 
    return EXIT_SUCCESS; 
} 

Он печатает, как показано ниже:

sizeof(a) = 16 
sizeof(b) = 8 
+2

Ну, это известно во время компиляции, что является массивом и то, что является а так как 'sizeof' оценивается и во время компиляции, это не сложно. – szczurcio

+0

http://stackoverflow.com/questions/37538/how-do-determine-the-size-of-my-array-in-c – c4f4t0r

+0

и https://stackoverflow.com/questions/492384/how- to-find-the-sizeofa-pointer-pointing-to-a array – WhozCraig

ответ

8

sizeof является время компиляции оператор а. Он вычисляется компилятором (и почти всегда является константой, исключающей VLA).

Компилятор, очевидно, знает, когда переменная ссылается на массив или указатель, потому что он должен знать тип каждой переменной (а тип массива не совпадает с типом указателя).

Обратите внимание, что в C массив может decay в указатель (например, когда вы передаете массив в качестве аргумента в процедуру). Это одна из самых сложных точек языка C (так что погрузитесь в книгу программирования C, если вы ее не понимаете).

1

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

имя ____ размер адрес ____ _____.... (другие вещи)

_____ 1000 _____ 16 _____.... (массив) < < <

б _____ 1016 _____ 8 _____.... .

.._____ 1024 _____.._____.......

и когда вы используете выражение как

printf("sizeof\(a) = %ld\n", sizeof(a)); 

компилятор заменит его (на одном из этапов перевода) с

printf("sizeof\(a) = %ld\n", 16); 

, а затем продолжить это сборник работа

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