Librería stddef.h en C

La librería <stddef.h> en C proporciona tipos de datos y macros fundamentales para manipular punteros, estructuras, tamaños de objetos en memoria y diferencias de punteros. Es especialmente útil en programación de bajo nivel, estructuras de datos y gestión de memoria. 

Funciones y Macros de <stddef.h> en C

1. size_t - Tamaño de objetos en memoria

Se usa para medir el tamaño de estructuras y objetos en bytes.


        #include <stddef.h>
        #include <stdio.h>
int main() {
  size_t tam = sizeof(int);   printf("El tamaño de un int es %zu bytes\n", tam);   return 0;
}

2. ptrdiff_t - Diferencia entre dos punteros

Tipo de dato entero para almacenar la diferencia entre dos punteros.


        #include <stddef.h>
        #include <stdio.h>
int main() {
  int arr[10];   int *p1 = &arr[2], *p2 = &arr[8];
  ptrdiff_t diferencia = p2 - p1;   printf("Diferencia de punteros: %td elementos\n", diferencia);
  return 0; }

3. NULL - Puntero nulo

Define un puntero que no apunta a ninguna dirección válida.


        #include <stddef.h>
        #include <stdio.h>
int main() {
  int *puntero = NULL;   if (puntero == NULL) {     printf("El puntero está vacío.\n");
  }   return 0; }

4. offsetof() - Desplazamiento de un miembro dentro de una estructura

Devuelve el desplazamiento en bytes de un miembro dentro de una estructura.

 
        #include <stddef.h>
        #include <stdio.h>
struct Persona {   char nombre[20];   int edad;   double altura; };

int main() {   printf("Offset de edad: %zu bytes\n", offsetof(struct Persona, edad));   printf("Offset de altura: %zu bytes\n", offsetof(struct Persona, altura));   return 0; }

💡 Ejemplos avanzados con estructuras complejas

Ejemplo 1: Serialización de estructuras en archivos binarios

Este ejemplo usa offsetof() para escribir estructuras en un archivo binario.

 
        #include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

struct Cliente {
  char nombre[30];
  int id;
  double saldo;
};

void guardarCliente(struct Cliente c) {
  FILE *archivo = fopen("clientes.dat", "ab");
  if (!archivo) {
    printf("Error al abrir archivo.\n");
    return;
  }
  fwrite(&c, sizeof(struct Cliente), 1, archivo);
  fclose(archivo);
}

int main() {
  struct Cliente cliente1 = {"Juan Pérez", 101, 1520.50};
  guardarCliente(cliente1);
  printf("Cliente guardado en archivo binario.\n");
  return 0;
}

Ejemplo 2: Manejo de estructuras con punteros y diferencias de punteros

Calculamos la cantidad de elementos entre dos posiciones de un array usando ptrdiff_t.

 
        #include <stddef.h>
#include <stdio.h>

struct Producto {
  char nombre[30];
  double precio;
};

int main() {
  struct Producto inventario[5] = {
    {"Laptop", 1500.00},
    {"Mouse", 20.50},
    {"Teclado", 45.30},
    {"Monitor", 299.99},
    {"SSD", 120.00}
  };

  struct Producto *inicio = &inventario[0];
  struct Producto *fin = &inventario[4];
  ptrdiff_t diferencia = fin - inicio;
  printf("Elementos entre inicio y fin: %td\n", diferencia);
  return 0;
}









Destacado

Bootloader Avanzado en Ensamblador

Bootloader Avanzado en Ensamblador Características del Bootloader Se carga en la dirección 0x7C00 (BIOS). ...