<stdlib.h>
No cabeçalho <stdlib.h> estão localizadas as funções responsáveis pela manipulação da alocação (e desalocação) dinâmica de memória, bem como funções para converter strings em valores numéricos (como double ou int). Além disso, a biblioteca fornece utilitários gerais como geração de números pseudoaleatórios, controle do fluxo do programa e algoritmos padrão de busca e ordenação.
Variáveis e Tipos
- size_t: Tem por finalidade indicar o tamanho, em bytes, que uma variável ou objeto ocupa na memória. É um tipo inteiro sem sinal.
- wchar_t: Tem por finalidade representar caracteres com codificação ampla (wide characters),
ou seja, caracteres com códigos maiores que aqueles que o tipo
chartradicional suporta. - div_t: Estrutura (struct) que contém dois campos do tipo
int(quot e rem); armazena o quociente e o resto da divisão entre dois números. - ldiv_t: Estrutura (struct) que contém dois campos do tipo
long int(quot e rem); armazena o quociente e o resto da divisão entre dois números.
Macros
- NULL: Macro utilizado para indicar que um ponteiro não aponta para um endereço de memória válido.
- EXIT_FAILURE: Macro utilizado para indicar (via função
exit) que um programa foi finalizado de forma inesperada ou com erro. - EXIT_SUCCESS: Macro utilizado para indicar que um programa foi finalizado corretamente e com sucesso.
- RAND_MAX: Macro que indica o valor máximo absoluto que pode ser retornado pela função
rand(). - MB_CUR_MAX: Valor máximo (em bytes) que um caractere multibyte pode ocupar no locale atual.
Funções
double atof(const char *stringNum)
Converte uma string (cadeia de caracteres) para um valor de ponto flutuante (double).
Exemplo
// EXEMPLO ATOF()
#include <stdio.h>
#include <stdlib.h>
int main() {
char *exemplo = "42\0";
double resposta = atof(exemplo);
printf("%.0lf é a resposta!!!\n", resposta);
return 0;
}
Saída esperada
>./main
42 é a resposta!!!
int atoi(const char *stringNum)
Converte uma string (cadeia de caracteres) para um valor inteiro (int).
Exemplo
// EXEMPLO ATOI()
#include <stdio.h>
#include <stdlib.h>
int main() {
char *exemplo = "42\0";
int resposta = atoi(exemplo);
printf("%d é a resposta!!!\n", resposta);
return 0;
}
Saída esperada
>./main
42 é a resposta!!!
long atol(const char *stringNum)
Converte uma string (cadeia de caracteres) para um valor inteiro longo (long).
Exemplo
// EXEMPLO ATOL()
#include <stdio.h>
#include <stdlib.h>
int main() {
char *exemplo = "42\0";
long int resposta = atol(exemplo);
printf("%ld é a resposta!!!\n", resposta);
return 0;
}
Saída esperada
>./main
42 é a resposta!!!
double strtod(const char *stringComNum, char **resto)
Lê um número de ponto flutuante de uma string e armazena o restante não numérico em um ponteiro.
Exemplo
// EXEMPLO STRTOD()
#include <stdio.h>
#include <stdlib.h>
int main() {
char *exemplo = "42 é a resposta!!!\0";
double resposta = strtod(exemplo, NULL);
printf("%.0lf!!!\n", resposta);
return 0;
}
Saída esperada
>./main
42!!!
long int strtol(const char *stringComNum, char **resto, int base)
Converte o prefixo de uma string para um número do tipo long int baseado numa
base numérica (ex: 10, 16).
Exemplo
// EXEMPLO STRTOL()
#include <stdio.h>
#include <stdlib.h>
int main() {
char *exemplo = "42 é a resposta!!!\0";
long int resposta = strtol(exemplo, NULL, 10);
printf("%ld!!!\n", resposta);
return 0;
}
Saída esperada
>./main
42!!!
unsigned long int strtoul(const char *stringComNum, char **resto, int base)
Similar ao strtol, mas converte para um unsigned long int.
Exemplo
// EXEMPLO STRTOUL()
#include <stdio.h>
#include <stdlib.h>
int main() {
char *exemplo = "42 é a resposta!!!\0";
unsigned long int resposta = strtoul(exemplo, NULL, 10);
printf("%lu!!!\n", resposta);
return 0;
}
Saída esperada
>./main
42!!!
int rand()
Gera números inteiros pseudoaleatórios dentro do limite de 0 até RAND_MAX.
Exemplo
// EXEMPLO RAND()
#include <stdio.h>
#include <stdlib.h>
int main() {
// Número randômico entre 0 e 9
int randomico = rand() % 10;
printf("%d.\n", randomico);
// Número randômico entre 0 e 41
randomico = rand() % 42;
printf("%d não é a resposta...\n", randomico);
return 0;
}
Saída esperada
>./main
3.
3 não é a resposta...
void srand(unsigned int semente)
Configura o valor inicial ("semente") para a geração dos números da função rand().
Exemplo
// EXEMPLO SRAND()
#include <stdio.h>
#include <stdlib.h>
int main() {
// Ao definir a mesma semente, rand gerará sempre a mesma sequência
srand(42);
int randomico = rand() % 10;
printf("%d.\n", randomico);
return 0;
}
Saída esperada
>./main
6.
void *calloc(size_t quantidadeElementos, size_t tamanhoDoTipo)
Aloca dinamicamente um bloco de memória para um array de elementos e os inicializa com zero.
Exemplo
// EXEMPLO CALLOC()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *numero = (int *)calloc(1, sizeof(int));
// Como foi usado calloc, o valor inicializa como zero.
printf("%d não é a resposta...\n", *numero);
*numero = 42;
printf("%d é a resposta em uma variável dinamicamente alocada!\n", *numero);
free(numero);
return 0;
}
Saída esperada
>./main
0 não é a resposta...
42 é a resposta em uma variável dinamicamente alocada!
void *malloc(size_t tamanhoDoTipo)
Aloca dinamicamente um bloco de memória, mas diferentemente do calloc, o
conteúdo não é inicializado (pode conter "lixo" de memória).
Exemplo
// EXEMPLO MALLOC()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *numero = (int *)malloc(sizeof(int));
// Valor será lixo (imprevisível), vamos sobrescrevê-lo:
*numero = 42;
printf("%d é a resposta em uma variável dinamicamente alocada!\n", *numero);
free(numero);
return 0;
}
Saída esperada
>./main
42 é a resposta em uma variável dinamicamente alocada!
void *realloc(void *ponteiro, size_t tamanhoDoTipo)
Redimensiona (aumenta ou diminui) o tamanho de um bloco de memória que foi previamente alocado.
Exemplo
// EXEMPLO REALLOC()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *numero = (int *)malloc(sizeof(int));
*numero = 42;
printf("%d é a resposta!\n", *numero);
// Expande a memória para suportar 10 inteiros
numero = (int *)realloc(numero, 10 * sizeof(int));
for (int i = 0; i < 10; i++) {
numero[i] = 42;
}
for (int i = 0; i < 10; i++) {
printf("%d ", numero[i]);
}
putchar('\n');
free(numero);
return 0;
}
Saída esperada
>./main
42 é a resposta!
42 42 42 42 42 42 42 42 42 42
void free(void *ponteiro)
Libera manualmente o espaço de memória que foi previamente alocado (evitando memory leaks).
Exemplo
// EXEMPLO FREE()
#include <stdio.h>
#include <stdlib.h>
int main() {
int *numero = (int *)malloc(sizeof(int));
*numero = 42;
free(numero);
printf("Ponteiro liberado!\n");
return 0;
}
Saída esperada
>./main
Ponteiro liberado!
void abort()
Interrompe forçadamente o programa gerando um sinal SIGABRT.
Exemplo
// EXEMPLO ABORT()
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Essa mensagem será mostrada na saída padrão.\n");
abort();
printf("Essa mensagem não será mostrada...\n");
return 0;
}
Saída esperada
>./main
Essa mensagem será mostrada na saída padrão.
Aborted (core dumped)
void exit(int status)
Termina a execução do programa e retorna o código de status ao sistema operacional (0 = sucesso).
Exemplo
// EXEMPLO EXIT()
#include <stdio.h>
#include <stdlib.h>
int main() {
int numero = 422;
if (numero != 42) {
printf("Saindo com erro...\n");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
Saída esperada
>./main
Saindo com erro...
int atexit(void (*funcao)(void))
Registra uma função específica para ser chamada logo antes de o programa terminar com sucesso.
Exemplo
// EXEMPLO ATEXIT()
#include <stdio.h>
#include <stdlib.h>
void respostaFinal() {
printf("42 é a resposta!\n");
}
int main() {
atexit(respostaFinal);
printf("Mensagem qualquer antes de finalizar o programa...\n");
return 0;
}
Saída esperada
>./main
Mensagem qualquer antes de finalizar o programa...
42 é a resposta!
int system(const char *comandoSO)
Passa um comando como string para o processador de comandos hospedeiro (shell/terminal).
Exemplo
// EXEMPLO SYSTEM()
#include <stdio.h>
#include <stdlib.h>
int main() {
system("echo \"42 é a resposta!\"");
return 0;
}
Saída esperada
>./main
42 é a resposta!
char *getenv(const char *nomeVariavel)
Acessa uma variável de ambiente do sistema operacional.
Exemplo
// EXEMPLO GETENV()
#include <stdio.h>
#include <stdlib.h>
int main() {
char *path = getenv("HOME"); // ou "USERPROFILE" no Windows
if(path != NULL) {
printf("%s\n", path);
}
return 0;
}
Saída esperada
>./main
/home/user
void *bsearch(const void *chave, const void *array, size_t tamanhoDoArray, size_t tamanhoDoTipo, int (*compara)(const void *, const void *))
Realiza uma busca binária em um array ordenado em busca de um elemento.
Exemplo
// EXEMPLO BSEARCH()
#include <stdio.h>
#include <stdlib.h>
int compara(const void *a, const void *b) {
return (*((int *)a) - *((int *)b));
}
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int chave = 9;
int *achou;
achou = bsearch(&chave, array, 10, sizeof(int), compara);
if (achou == NULL) {
printf("O número informado não está no array.\n");
} else {
printf("O número %d está no array!\n", *achou);
}
return 0;
}
Saída esperada
>./main
O número 9 está no array!
void qsort(void *array, size_t tamanhoDoArray, size_t tamanhoDoTipo, int (*compara)(const void *, const void *))
Ordena um array (usualmente utilizando o algoritmo Quick Sort) utilizando uma função de avaliação externa.
Exemplo
// EXEMPLO QSORT()
#include <stdio.h>
#include <stdlib.h>
int compara(const void *a, const void *b) {
return (*((int *)a) - *((int *)b));
}
int main() {
int array[10] = {7, 8, 3, 5, 9, 1, 4, 6, 10, 2};
printf("Array antes:\n");
for (int i = 0; i < 10; i++) printf("%d ", array[i]);
putchar('\n');
qsort(array, 10, sizeof(int), compara);
printf("Array após:\n");
for (int i = 0; i < 10; i++) printf("%d ", array[i]);
putchar('\n');
return 0;
}
Saída esperada
>./main
Array antes:
7 8 3 5 9 1 4 6 10 2
Array após:
1 2 3 4 5 6 7 8 9 10
int abs(int numero)
Retorna o valor absoluto de um número inteiro.
Exemplo
// EXEMPLO ABS()
#include <stdio.h>
#include <stdlib.h>
int main() {
int valor = -42;
printf("Número informado: %d\n", valor);
printf("Módulo: %d\n", abs(valor));
return 0;
}
Saída esperada
>./main
Número informado: -42
Módulo: 42
long int labs(long int numero)
Retorna o valor absoluto de um número inteiro longo.
Exemplo
// EXEMPLO LABS()
#include <stdio.h>
#include <stdlib.h>
int main() {
long int valor = -42;
printf("Número informado: %ld\n", valor);
printf("Módulo: %ld\n", labs(valor));
return 0;
}
Saída esperada
>./main
Número informado: -42
Módulo: 42
div_t div(int numerador, int denominador)
Retorna simultaneamente o quociente e o resto de uma divisão entre dois inteiros.
Exemplo
// EXEMPLO DIV()
#include <stdio.h>
#include <stdlib.h>
int main() {
int numerador = 9;
int denominador = 3;
div_t divisao = div(numerador, denominador);
printf("A divisão de %d por %d resulta em: %d\n", numerador, denominador, divisao.quot);
printf("O resto da divisão é: %d\n", divisao.rem);
return 0;
}
Saída esperada
>./main
A divisão de 9 por 3 resulta em: 3
O resto da divisão é: 0
ldiv_t ldiv(long int numerador, long int denominador)
Similar à função div(), mas lidando com números inteiros longos.
Exemplo
// EXEMPLO LDIV()
#include <stdio.h>
#include <stdlib.h>
int main() {
long int numerador = 9;
long int denominador = 3;
ldiv_t divisao = ldiv(numerador, denominador);
printf("A divisão de %ld por %ld resulta em: %ld\n", numerador, denominador, divisao.quot);
printf("O resto da divisão é: %ld\n", divisao.rem);
return 0;
}
Saída esperada
>./main
A divisão de 9 por 3 resulta em: 3
O resto da divisão é: 0