2010-04-08 15 views
5

El prototipo de memset es void *memset(void *s, int c, size_t n);. Entonces, ¿por qué el tercer parámetro es del tipo size_t? memset es solo un ejemplo, quiero razones más generales. Gracias por adelantado.¿Por qué son los parámetros de función de tipo size_t?

+0

Ver también: http://stackoverflow.com/questions/502856/whats-the-difference-between-sizet-and-int-in-c –

Respuesta

5

size_t es el tipo de retorno del operador sizeof y se usa para describir tamaños de memoria. En el caso de memset, especifica el número de bytes (n) en los bloques de memoria que se deben establecer en el valor dado (c).

El tamaño en bits de size_t varía en función del espacio de direcciones de la plataforma de destino. No siempre se correlaciona con el tamaño del registro. Por ejemplo, en una arquitectura de memoria segmentada, el sizeof (size_t) puede ser más pequeño que el sizeof (void *). Normalmente, size_t sería 4 bytes en una máquina de 32 bits, 8 bytes en una máquina de 64 bits, etc.

+0

¿Podría explicarnos más acerca de por qué 'sizeof (size_t) puede ser más pequeño que el sizeof (void *) '? Muchas gracias;) – Grissiom

+1

En la memoria segmentada, el tamaño de cada segmento es menor que el tamaño total de la memoria. Por ejemplo, en un 80286 puede direccionar 2^24 bytes totales pero solo usar 2^16 bytes contiguos dentro de cada segmento. Ver http://en.wikipedia.org/wiki/SeguridadMemoria Ahora, no tengo un 80286 con un compilador C99 a mano, pero supongo que sizeof (size_t) == 2 y sizeof (void) *) == 4. –

+0

Entonces, ¿qué será cuando intente memset 2^20 bytes en 80286? Aunque es demasiado grande, pero creo que tiene sentido porque podemos abordar 2^24 bytes. – Grissiom

2

size_t es el tipo utilizado para indicar el tamaño de los objetos. En los tamaños C de los tipos enteros (int, long, etc.) dependen de la implementación y debe usar el tipo correcto en cada implementación del compiladorp de modo que el tamaño sea lo suficientemente grande como para almacenar todos los valores posibles.

Los encabezados que vendrán con la plataforma SDK tendrán un typedef que asignará size_t al tipo de entero a la derecha. Entonces, escribe memset() una vez y compila directamente en cada implementación.

1

size_t es un tipo adecuado para representar la cantidad de memoria que requiere un objeto de datos. Es un tipo entero sin signo (generalmente, typedef unsigned int size_t;).

Lea this enlace para obtener más información.

+0

Eso no es verdad. En muchas (si no la mayoría) plataformas de 64 bits 'unsigned int' es de 32 bits, mientras que' size_t' es de 64 bits. – slacker

+0

¡Sí, tienes razón! – yassin

-2

size_t se garantiza que es lo suficientemente grande como para mantener un puntero en todas las plataformas.

+0

Ver la respuesta del juez Maygarden. – user9876

+0

Nice downmod, pero si realmente lees y entiendes la respuesta del juez Maygarden, verás que estamos diciendo exactamente lo mismo. "El tamaño en bits de size_t varía en función del espacio de direcciones de la plataforma objetivo" es isomorfo a "size_t se garantiza que es lo suficientemente grande como para contener un puntero en todas las plataformas". El juez Maygarden dijo que size_t podría ser más pequeño que el tamaño de registro en algunas plataformas. Él no dijo que podría ser más pequeño que el tamaño del puntero, porque no puede ser. – jemfinch

+0

Entonces, ¿cuál es la diferencia entre el tamaño del registro y el tamaño del puntero? – Grissiom

Cuestiones relacionadas