Namespaces
Variants

ptrdiff_t

From cppreference.net
< c ‎ | types
Definido en el encabezado <stddef.h>
typedef /*implementation-defined*/ ptrdiff_t ;

ptrdiff_t es el tipo entero con signo del resultado de restar dos punteros .

El ancho de bits de ptrdiff_t no es menor que 17.

(desde C99)
(hasta C23)

El ancho de bits de ptrdiff_t no es menor que 16.

(desde C23)

Contenidos

Notas

ptrdiff_t se utiliza para aritmética de punteros e indexación de arreglos, si son posibles valores negativos. Los programas que utilizan otros tipos, como int , pueden fallar en, por ejemplo, sistemas de 64 bits cuando el índice excede INT_MAX o si depende de aritmética modular de 32 bits.

Solo se pueden restar entre sí punteros a elementos del mismo arreglo (incluyendo el puntero una posición después del final del arreglo).

Si un array es tan grande (mayor que PTRDIFF_MAX elementos, pero igual o menor que SIZE_MAX bytes), que la diferencia entre dos punteros podría no ser representable como ptrdiff_t , el resultado de restar dos de estos punteros es indefinido.

Para arreglos de caracteres más cortos que PTRDIFF_MAX , ptrdiff_t actúa como la contraparte con signo de size_t : puede almacenar el tamaño del arreglo de cualquier tipo y es, en la mayoría de plataformas, sinónimo de intptr_t ).

Implementación posible

typedef typeof((int*)nullptr - (int*)nullptr) ptrdiff_t; // válido desde C23

Ejemplo

#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
int main(void)
{
    const size_t N = 100;
    int numbers[N];
    printf("PTRDIFF_MAX = %ld\n", PTRDIFF_MAX);
    int *p1 = &numbers[18], *p2 = &numbers[23];
    ptrdiff_t diff = p2 - p1;
    printf("p2-p1 = %td\n", diff);
}

Salida posible:

PTRDIFF_MAX = 9223372036854775807
p2-p1 = 5

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.19 Definiciones comunes <stddef.h> (p: TBD)
  • 7.20.3 Límites de otros tipos enteros (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.19 Definiciones comunes <stddef.h> (p: 211)
  • 7.20.3 Límites de otros tipos enteros (p: 215)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.19 Definiciones comunes <stddef.h> (p: 288)
  • 7.20.3 Límites de otros tipos enteros (p: 293)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.17 Definiciones comunes <stddef.h> (p: 253)
  • 7.18.3 Límites de otros tipos enteros (p: 258)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.1.6 Definiciones comunes <stddef.h>

Véase también

tipo entero sin signo devuelto por el operador sizeof
(typedef)
desplazamiento en bytes desde el inicio de un tipo struct hasta el miembro especificado
(macro de función)