Estoy tan confundido size_t. He buscado en Internet y en todas partes mencioné que size_tes un tipo sin firmar, por lo que solo puede representar valores no negativos.
Mi primera pregunta es: si se usa para representar solo valores no negativos, ¿por qué no lo usamos en unsigned intlugar de size_t?
La segunda pregunta es: ¿ size_ty unsigned intintercambiables o no? Si no es así, ¿por qué?
¿Y alguien puede darme un buen ejemplo size_ty brevemente de su funcionamiento?

typedef /*This part is implementation dependent */ size_t;Respuestas:
Porque
unsigned intno es el único tipo de entero sin signo.size_tpodría ser cualquiera deunsigned char,unsigned short,unsigned int,unsigned longounsigned long long, dependiendo de la aplicación.No son intercambiables, por el motivo explicado anteriormente
^^.No entiendo muy bien lo que quieres decir con "su breve trabajo". Funciona como cualquier otro tipo sin firmar (en particular, como el tipo al que está escrito). Se le anima a usar
size_tcuando describa el tamaño de un objeto. En particular, elsizeofoperador y varias funciones de biblioteca estándar, comostrlen()returnsize_t.Bono: aquí hay un buen artículo sobre
size_t(y elptrdiff_ttipo más relacionado ). Razona muy bien por qué debería usarlo.fuente
size_tser ununsigned char? ¿Está esto en el estándar que está permitido? Quiero decir, con esa idea, ¿cómo se puede esperar que alguien usecalloc()(y una familia),strlen()etc.? Eso me parece absurdo.size_testá definido en el estándar como un "tipo entero sin signo", pero no requiere que sea igual a cualquiera deunsigned {char, short, int, long, long long}.Hay 5 tipos de enteros sin signo estándar en C:
unsigned charunsigned shortunsigned intunsigned longunsigned long longcon varios requisitos para sus tamaños y rangos (brevemente, el rango de cada tipo es un subconjunto del rango del siguiente tipo, pero algunos de ellos pueden tener el mismo rango).
size_tes untypedef(es decir, un alias) para algún tipo sin signo (probablemente uno de los anteriores, pero posiblemente un tipo entero sin signo extendido , aunque eso es poco probable). Es el tipo cedido por elsizeofoperador.En un sistema, podría tener sentido usarlo
unsigned intpara representar tamaños; en otro, podría tener más sentido usarunsigned longounsigned long long. (size_tes poco probable que seaunsigned charounsigned short, pero está permitido).El propósito de
size_tes aliviar al programador de tener que preocuparse por qué de los tipos predefinidos se usa para representar tamaños.Código que asume
sizeofrendimientosunsigned inty no sería portátil.size_tEs más probable que el código que asume que produce una sea portátil.fuente
unsigned int,unsigned long, etc.) quesize_tcorresponde a depende de la máquina en la que se ejecuta el código? es decir, en una arquitectura de máquina, correspondeunsigned intpero en otra arquitectura corresponderáunsigned long, etc.size_t, especialmente si, por ejemplo,unsigned longyunsigned long longtienen el mismo tamaño.long,long longetc. depende del sistema: si le echas un vistazolimits.h, al menos en Unices verás que el valor máximo de ints depende del tamaño de palabra del sistema.size_ttiene una restricción específica.Citando de http://www.cplusplus.com/reference/cstring/size_t/ :
No es intercambiable con
unsigned intporque el tamaño deintlo especifica el modelo de datos. Por ejemplo, LLP64 usa 32 bitsinte ILP64 usa 64 bitsint.fuente
size_t se utiliza para almacenar tamaños de objetos de datos y se garantiza que puede contener el tamaño de cualquier objeto de datos que la implementación de C particular pueda crear. Este tipo de datos puede ser más pequeño (en número de bits), más grande o exactamente igual que unsigned int.
fuente
Aparte de las otras respuestas, también documenta el código y le dice a la gente que está hablando del tamaño de los objetos en la memoria.
fuente
applees una manzana , asize_tes un tamaño ...size_t type es un tipo de entero sin signo base del lenguaje C / C ++. Es el tipo de resultado devuelto por el operador sizeof. El tamaño del tipo se elige para que pueda almacenar el tamaño máximo de una matriz teóricamente posible de cualquier tipo. En un sistema de 32 bits, size_t tomará 32 bits, en uno de 64 bits, 64 bits. En otras palabras, una variable de tipo size_t puede almacenar un puntero de forma segura. La excepción son los punteros a las funciones de clase, pero este es un caso especial. Aunque size_t puede almacenar un puntero, es mejor usar otro tipo de entero sin signo uintptr_t para ese propósito (su nombre refleja su capacidad). Los tipos size_t y uintptr_t son sinónimos. El tipo size_t se usa generalmente para contadores de bucles, indexación de matrices y aritmética de direcciones. El valor máximo posible del tipo size_t es constante SIZE_MAX.
fuente
size_tpuede almacenar el tamaño de cualquier objeto. Un puntero puede apuntar a cualquier byte de cualquier objeto. Puede tener un sistema con, por ejemplo, un espacio de direcciones de 64 bits que limita el tamaño de cualquier objeto a 2 ** 32-1 bytes. No hay garantía de quesize_tyuintptr_tsean del mismo tipo.En palabras simples, size_t depende de la plataforma y de la implementación, mientras que unsigned int solo depende de la plataforma.
fuente