2013-09-28 3 views
2

Мне было просто интересно: с sizeof() возвращается тип size_t, почему sizeof(size_t) дайте мне 4? То есть, когда я malloc(someSize), я просил someSize байт или someSize*4 байтов?Почему sizeof (size_t) не 1?

Я занимаюсь домашней работой в ASM в течение двух дней, и теперь я становлюсь довольно запутанным. Спасибо за вашу помощь!

+1

Вам нужно объяснить основные причины этого вопроса лучше. Почему на Земле вы ожидаете, что 'sizeof (size_t)' будет 1 ??? Это совершенно непонятно из того, что вы заявили в своем вопросе. 'sizeof' измеряет размеры в темах' sizeof (char) ', поэтому' sizeof (char) 'действительно всегда 1. Но почему вы ожидаете, что sizeof (size_t)' будет 1? – AnT

+0

Ваш вопрос не имеет смысла. Размер переменной не коррелирует со значением в нем. То, что вы спрашиваете, равносильно тому, чтобы спросить, почему умножение числа на любой 'int' не всегда эквивалентно умножению этого числа на 4. –

+0

На самом деле это отличный вопрос, чтобы различать понятия числового значения и размер типа, используемого для представления этого численного значения. – wilsonmichaelpatrick

ответ

3

В соответствии со стандартом ISO C 1999 (C99) size_t представляет собой целочисленный тип без знака не менее 16 бит (см. Разделы 7.17 и 7.18.3).

size_t - неподписанный тип данных, определенный несколькими стандартами C/C++, например. стандарт C99 ISO/IEC 9899, ​​который определен в stddef.h.1. Он может быть дополнительно импортирован путем включения stdlib.h, так как этот внутренний файл содержит stddef.h.

Этот тип используется для представления размера объекта. Функции библиотеки, которые принимают или возвращают размеры, предполагают, что они имеют тип или имеют тип возврата size_t. Кроме того, наиболее часто используемый оператор size size для компилятора должен оценивать постоянное значение, которое совместимо с size_t.

Об этом шла речь в этом посте: What is size_t in C?

И когда вы malloc(sizeof(int)) он выделяет четыре байта памяти динамически. Не путайте между size_t и sizeof(size_t).

+1

Вы абсолютно правы: type! = Unit. Спасибо! Теперь я выхожу на свежий воздух ... – VoidStar

1

Почему sizeof(size_t) дайте мне 4?

Из-за size-t имеет тип unsigned long int, sizeof(size_t) даст размер unsigned long int на вашей машине (на моей машине - 32 bit-- он дает 4 байта).

#include <stdio.h> 

int main() 
{ 
    printf("%d\n", sizeof(unsigned long int)); 
    printf("%d\n", sizeof(size_t)); 
    return 0; 
} 

сделал я попросил someSize байт или someSize*4 байт?

Ответ: someSize, потому что sizeof функция определяет размер типа данных (в байтах). Тип возврата sizeof - size_t.
Итак, вы можете сказать sizeof определяет размер тип данных (в байтах), а возвращает size_t данные типа.

+1

'size_t' не' int'. – delnan

+0

... и int не обязательно 4 байта. – Mat

+0

Хорошо, но если 'X' является единицей возврата' sizeof() ', то как' sizeof (X) 'может отличаться от 1? – VoidStar

2

Вы вводите в заблуждение количество байтов, необходимых для представления некоторого значения, и количество байтов, необходимых для представления , размер. Или, как @Mat помещает это в комментарий, вы вводите в заблуждение тип и блок. sizeof(T) сообщает, сколько байтов (char s) используется значение типа T. Однако, поскольку некоторые типы могут быть довольно большими, занимая тысячи или даже миллионы байтов (считайте большие массивы), это значение необходимо сохранить с использованием интегрального типа, который сам занимает несколько байтов (size_t).

В качестве аналогии выпишите число 10^100 (гипотетически), а затем подсчитайте, сколько десятичных цифр это число имеет. Напишите последний номер (подсказка: 100). 100 сам берет несколько десятичных цифр для записи, но это не влияет на количество цифр 10^100.

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