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;
}
