Тип size_t является типом, возвращенным sizeof оператором. Это - целое число без знака, способное к выражению размера в байтах любого диапазона памяти, поддерживаемого на хост-машине. Это (обычно) связывается с ptrdiff_t в том ptrdiff_t, значение целого числа со знаком, таким образом, что sizeof (ptrdiff_t) и sizeof (size_t) равны.
При записи C кода Вы должны всегда использование size_t, имея дело с диапазонами памяти.
международный тип, с другой стороны, в основном определяется как размер целочисленного значения (со знаком), которое хост-машина может использовать, чтобы наиболее эффективно выполнить целочисленную арифметику. Например, на многих более старых компьютерах типа ПК значение sizeof (size_t) было бы 4 (байты), но sizeof (интервал) будет 2 (байт). Арифметика на 16 битов была быстрее, чем арифметика на 32 бита, хотя ЦП мог обработать (логическое) пространство памяти до 4 гибибайт.
Использование международный тип только, когда Вы заботитесь об эффективности, поскольку ее фактическая точность зависит сильно от обоих параметров компилятора и архитектуры машины. В особенности стандарт C определяет следующие инварианты: sizeof (символ) < = sizeof (короткий) < = sizeof (интервал) < = sizeof (долго) помещающий никакие другие ограничения на фактическое представление точности, доступной программисту для каждых из этих типов примитивов.
Примечание: Это не то же как в Java (который на самом деле определяет разрядную точность для каждого из типов 'символ', 'байт', 'короткий', 'международный' и 'длинный').
Если оставить в стороне глобальные переменные и переменные, объявленные с модификатором static
(которые выделяются в отдельной области памяти), локальные переменные, объявленные в теле функции, размещаются в стеке, тогда как все, что вы вызываете malloc
, размещается в куче. Кроме того, массивы переменного размера C99 и память, выделенная с помощью _alloca
, окажутся в стеке.
int* x[10]; // The addresses are held on the stack
int i; // On the stack
for(i = 0; i < 10; ++i)
x[i] = malloc(sizeof(int)*10); // Allocates memory on the heap
Например, в приведенном выше коде в стеке есть массив значений int *
хранение адресов в 10 различных местах в куче.