1. El Lenguaje de programaci´onC
Sistemas Operativos
Sistemas Operativos El Lenguaje de programaci´on C 1 / 218
Universidade daCorun˜a
2. El Lenguaje de programaci´onC I
Sistemas Operativos El Lenguaje de programaci´on C 2 / 218
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Tipos, operadores y expresiones
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
3. El Lenguaje de programaci´onC II
Funciones y estructura deun programa
Sistemas Operativos El Lenguaje de programaci´on C 3 / 218
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´on condicional
Precedencia y ordeneevaluaci´on
Ejercicios
Control deflujo
Sentencias y bloques
if else
else-if
switch
bucleswhile, for ydo..while
break ycontinue
gotoy etiquetas
Ejercicios
4. El Lenguaje de programaci´onC III
Sistemas Operativos El Lenguaje de programaci´on C 4 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Arrays y punteros
Punteros ydirecciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays de punteros
Arrays multidimensionales
5. El Lenguaje de programaci´onC IV
Sistemas Operativos El Lenguaje de programaci´on C 5 / 218
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Estructuras
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Biblioteca C
Biblioteca C
6. El Lenguaje de programaci´onC V
Sistemas Operativos El Lenguaje de programaci´on C 6 / 218
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida con formato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sin formato
Ejercicios
Herramientas
Valgrind
7. Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 7 / 218
8. Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 8 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
9. Caracter´ısticas del lenguaje C
Sistemas Operativos El Lenguaje de programaci´on C 9 / 218
► Esel lenguaje deprogramaci´ondeprop´ositogeneralasociado al
sistemaoperativo UNIX
► Esun lenguaje demedio nivel. Trata conobjetos b´asicos como
car´acteres,nu´meros. . . ; tambi´enconbits y direcciones de
memoria
► Poseeunagranportabilidad
► Seutiliza parala programaci´ondesistemas:construcci´onde
interpretes, compiladores, editores detexto, etc
10. ► El lenguaje Cconsta de
► El lenguaje Cpropiamente dicho: tipos dedatos, expresiones y
estructuras decontrol
► Extensionesenforma demacrosy un amplio conjunto de
librer´ıas predefinidas
Sistemas Operativos El Lenguaje de programaci´on C 10 / 218
11. Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 11 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
12. Estructura de un programa C
Sistemas Operativos El Lenguaje de programaci´on C 12 / 218
► Un programa eCconsta deuno om´asm´odulos(ficheros
fuentes)
► Cadam´odulopuedecontener
► directivas del precompilador, p.e para“incluir” otros ficheros
(#include) y “definir” constantesy macros (#define)
► declaracionesdevariables y prototipos defunciones
► una o m´asfunciones
► comentarios
► Cadafunci´onpuedecontener
► directivas delprecompilador
► declaraciones
► uno om´asbloques
► comentarios
13. ► Cadabloque puede contener
► directivas del precompilador
► declaraciones
► una om´assentencias
► comentarios
Sistemas Operativos El Lenguaje de programaci´on C 13 / 218
14. ► Cadasentencia debeestarterminada por ;
► Cadabloque desentencias seencierra entre llaves {.. . }
► La funci´ondenominada main esla queprimero seejecuta
► Loscomentarios puedenaparecerencualquier lugar del c´odigo y
seinsertan entre /* y */ as´ı
/* esto es un comentario*/
► oentre // y final de l´ınea
// esto es otro comentario
Sistemas Operativos El Lenguaje de programaci´on C 14 / 218
15. Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 15 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
17. #include <stdio.h>
main()
{
int fahr, celsius;
int lower, upper, step;
lower=0;
upper=300;
step=20;
fahr=lower;
while(fahr<=upper)
{
celsius=5*(fahr-32)/9;
printf("%dt%dn",fahr,celsius);
fahr=fahr+step;
}
}
Sistemas Operativos El Lenguaje de programaci´on C 17 / 218
18. Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 18 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
19. Compilacio´n de un programa
Sistemas Operativos El Lenguaje de programaci´on C 19 / 218
► Normalmente invocamos al compilador concc ogcc (el
compilador degnu)
► Cuandotecleamoscc programa.c paragenerarun ejecutable
apartir deun fichero fuente obtenemosun ejecutable,
t´ıpicamentedenominado a.out.Sin embargoserealizan tres
tareas
► Pasopor el preprocesadorC. Esel queprocesalas l´ıneasque
comienzan con # (pe #include, #define. . . ). Puede
invocarse directamente con cpp
► La compilaci´onpropiamente dicha. Generaficheros objeto (.o) a
partir delos ficheros fuente. Puedeinvocarse como cc -c
► El enlazado. Realizado por ld
20. Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 20 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
21. Directivas del precompilador
Sistemas Operativos El Lenguaje de programaci´on C 21 / 218
#include Incluye el fichero, cuyo nombre seindica, para sucompilaci´on
con el resto delc´odigo
► Si el nombre del fichero va entre <...> se busca en el
directorio include del sistema (/usr/include). Por ejemplo
#include <stdio.h>
hace que el fichero /usr/include/stdio.h se incluya en ese
punto para ser compilado con nuestro fichero fuente
► El nombre se puede poner entre comillas (“) y el sistema lo
buscar´a en el directorio actual (tambi´en se puede poner una
ruta absoluta)
► Los ficheros se suelen denominar .h y contienen declaraciones
de tipos, variables y prototipos de funciones (son ficheros
fuente que pueden verse)
22. #define Define un s´ımbolo,esdecir cadaocurrencia deeses´ımboloes
sustituida por sudefinici´on. Porejemplo
Sistemas Operativos El Lenguaje de programaci´on C 22 / 218
► El C distingue entre mayu´sculasy minu´sculas, aunque la
costumbre es utilizar mayu´sculaspara los s´ımbolosdefinidos
por el preprocesador
► ejemplo
#define M
A
X 1024
hace que todas las ocurrencias de la cadena MAX dentro del
c´odigo son sustituidas por 1024
► El c´odigo que se compila lleva 1024 donde iba MAX
► Si MAX iba dentro de comillas ’ ’ . . . ‘ ‘ , no sesustituye
23. #include <stdio.h>
#define UPPER 300
#define LOWER 0
#define STEP 20
main()
{
int fahr, celsius;
fahr=LOWER;
while(fahr<=UPPER)
{
celsius=5*(fahr-32)/9;
printf("%dt%dn",fahr,celsius);
fahr=fahr+STEP;
}
}
Sistemas Operativos El Lenguaje de programaci´on C 23 / 218
24. Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 24 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
25. Depuracio´n
Sistemas Operativos El Lenguaje de programaci´on C 25 / 218
► Paradepurar programasdisponemos del depurador,quenos
permite ejecutar los programasenun entorno controlado
► Para usareldepurador
a. Compilamos con cc -g
$gcc -g ejercicio1.c
b. Invocamos el depuradorpas´andoleel ejecutable como
par´ametro
antonio@abyecto:~$ gdb a.out
GNU gdb (GDB) 7.3-debian
Copyright (C) 2011 Free Software Foundation, Inc.
.......
(gdb)
► Dentro del depuradorpodemosestablecer puntos deruptura con
break (break numerol´ınea o break nombrefunci´on),
ejecutar pasoapasocon step o next,ver variables con
display . . . . El depurador dispone deayudaenl´ınea, mediante
help
26. Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 26 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
27. make
Sistemas Operativos El Lenguaje de programaci´on C 27 / 218
► Facilita el procesodegeneraci´on y actualizaci´ondeun
programa.
► Determina autom´aticamentequ´epartesdeun programa deben
recompilarseante una actualizaci´ondealgunosm´odulos y las
recompila.
► Secreanun archivo Makefile conlas dependenciasentre los
ficheros: un fichero debeactualizarse si alguna desus
dependenciasesm´asreciente
► El Makefile define tambi´enlos mandatos necesarios para
actualizar cadaarchivo enbaseasus dependencias
28. ► El Makefile estaformadopor unaseriedereglas.Donde
cadaregla tiene el siguiente formato
objetivo: dependencia1dependencia2. . .
mandato1
mandato2
mandato3
...
► N´otesequeantesdecadamandato hayun caracter tab
► Para compilar usamosla orden‘‘make objetivo’’ que
► Encuentra la regla correspondiente aobjetivo
► Trata susdependenciascomo objetivos y lasresuelve
recursivamente
► Dentro del Makefile sepuedendefinir variables (y accedera
susvalores) comoenel shell:VAR=valor paradefinir la
variable y ${VAR} o$(VAR) paraaccederasuvalor. $
@se
refiere al nombredelobjetivo
Sistemas Operativos El Lenguaje de programaci´on C 28 / 218
29. Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on C 29 / 218
► Consideremos el siguiente programa (programa.c)
#include "funcion1.h"
#include "funcion2.h"
main()
{
int a=MAX1,b=MAX2;
funcion1();
funcion2();
}
► Donde funcion1.h
#define MAX1 1000
void funcion1(void);
► y funcion2.h
#define MAX2 2000
void funcion2(void);
30. Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on C 30 / 218
► Adem´as,funcion1.c es
#include "funcion1.h"
void funcion1(void)
{
int i=MAX1;
return;
}
► y funcion2.c es
#include "funcion2.h"
void funcion2(void)
{
int j=MAX2;
return;
}
31. Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on C 31 / 218
► si queremoscompilarlo, y generarun programa llamado
programa.out
1. Compilar´ıamos funcion1.c
gcc -c funcion1.o funcion1.c
2. Compilar´ıamos funcion2.c
gcc -c funcion2.o funcion2.c
3. Compilar´ıamosprograma.c dela siguiente manera
gcc -o programa.out programa.c funcion2.o funcion1.o
► Cadavezquesemodificase uno delos archivos habr´ıaque
repetir alguna (o todas) delas anteriores compilaciones
32. Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on C 32 / 218
► El siguiente archivo Makefile seocupa dedecidir quehay
quecompilar y hacerlo
programa.out: programa.c funcion1.h funcion2.h funcion1.o funcion2.o
gcc -o programa.out programa.c funcion2.o funcion1.o
funcion1.o: funcion1.h funcion1.c
gcc -c funcion1.o funcion1.c
funcion2.o: funcion2.h funcion2.c
gcc -c funcion2.o funcion2.c
limpiar:
rm programa.out funcion1.o funcion2.o
33. Otro ejemplo de make
Sistemas Operativos El Lenguaje de programaci´on C 33 / 218
CC=gcc
CFLAGS=-g
OBJS2=prac2.o aux1.o
all: prac1 prac2
prac1: prac1.o aux1.o
gcc -g -o prac1 prac1.o aux1.o
prac2: $(OBJS2)
${CC} ${CFLAGS} -o $@ ${OBJS2}
prac1.o prac2.o: prac.h
clean:
rm -f prac1.o aux1.o ${OBJS2}
34. Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 34 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
35. Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 35 / 218
► Compilar los programasdeejemplo deesta secci´on
► Observar las salida del preprocesador de cada uno deellos
► Usarel depurador paraejecutar pasoapasolos dosu´ltimos y
ver comocambian devalor las variables enel bucle
► Crearun Makefile paraun archivo y compilarlo conmake
36. Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 36 / 218
37. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 37 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
38. Nombres de variables
► los nombresdevariables puedentener letras, nu´merosy el
s´ımbolo’ ’.
► Deben empezarpor unaletra (pueden empezarpor ’ ’ pero no
esrecomendable puesesel criterio queusanlas rutinas dela
biblioteca)
► Puedenllevar mayu´sculasy minu´sculas.El Cdistingue entre
mayu´sculasy minu´sculas
► La costumbreesquelas variables van enminu´sculay las
constantesenmayu´scula
► Laspalabrasreservadas if,else ...no puedenusarsecomo
nombresde variables
Sistemas Operativos El Lenguaje de programaci´on C 38 / 218
39. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 39 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
40. Tipos y taman˜osde datos
Sistemas Operativos El Lenguaje de programaci´on C 40 / 218
► El Ctiene pocostipos dedatos
char Un byte. Contiene un caracter (o un nu´meroentre 0 y 255) int
Un entero. El taman˜o dependedel sistema dondeestemos
float Un real
double Un real endoble precisi´on
► Adem´asint puedesershort o long y tanto int como char
puedensersigned o unsigned
► unsignedlong int, unsingedlong,
► El taman˜odepende del compilador pero int no esmenor que
short ni mayorquelong
► Existe tambi´enel long long int conmayorrango y el long
double conprecisi´onextendida paralos reales
41. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 41 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
42. Constantes
Sistemas Operativos El Lenguaje de programaci´on C 42 / 218
► Una constante entera esint (ejemplo 12714)
► Si queremosquesealong le ponemosel sufijo ’l’ o ’L’.
(ejemplo 12714L)
► Una constante con un punto decimal o un exponente es un
double (ejemplos 3.141516, 1e-5)
► Si queremosqueseafloat le ponemosel sufijo ’f’ o ’F’
(ejemplos 3.141516f,1e-5F)
► Si una constanteenteracomienzapor 0seentiende queest´a en
octal y si comienzapor 0x o0X enhexadecimal
► Ejemplos 034892(octal) 0xffff4000(hexadecimal)
43. ► Una constante car´actersepone entre comillas simples
(ejemplo ’a’). Puedeaparecerenoperaciones y suvalor esel
c´odigodedicho caracter
► Una constante car´actertambi´ensepuedeexpresar por su
c´odigoenoctal ohexadecimal. Ejemplos: ’077’ (octal) o
’x3f’ (hexadecimal)
► Algunas constantes especiales:’t’ (tab) ’n’ (fin del´ınea’)
’r’ retorno decarro . . .
► Una constante cadenaseencierra entre comillas dobles
(”. . . “). LascadenasenCest´anterminadaspor el caracter
’0’,
Sistemas Operativos El Lenguaje de programaci´on C 43 / 218
44. ► Una expresi´onconstante esuna expresi´onquesolo incluye
constantes.Puedeserevaluada entiempo decompilaci´on y
serutilizada enlugar deuna constante
#define MAXIMO 1024
char linea[MAXIMO/2 +20];
► Un casoparticular deconstantes sonlos tipos enumerados. Un
tipo enumeradoesuna lista devalores enterosconstantes
enum boolean {FALSE, TRUE};
► Salvo queseespecifique otra cosa,comienzanen0, as´ıFALSE
ser´ıa0y TRUE 1
► Tambi´enpuedeespecificarse el valor de comienzo
enum dias {LUNES=1, MARTES, MIERCOLES,
JUEVES, VIERNES, SABADO, DOMINGO};
Sistemas Operativos El Lenguaje de programaci´on C 44 / 218
45. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 45 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
46. Declaraciones de variables
Sistemas Operativos El Lenguaje de programaci´on C 46 / 218
► Todas las variables deben ser declaradas antes de su uso.
► Lasdeclaraciones debenapareceral principio decadafunci´on o
bloque de sentencias
► La declaraci´on consta deun tipo devariable y unalista de
variables separadasporcoma
int i,j;
float x,pi;
unsigned long longitud, contador;
► Lasvariables puedeninicializarse enla declaraci´on
float pi=3.1416;
unsigned long contador=0;
► Puede utilizarse el simbol const paraindicar quela variable no
puedeser cambiada
const float e=2.7182;
47. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 47 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
48. Operadores aritm´eticos
Sistemas Operativos El Lenguaje de programaci´on C 48 / 218
+ suma
- resta
* multiplicaci´on
/ divisi´on. Si los operandos sonenterosla divisi´onesentera
% resto entero. No admite operandos float odouble
50. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 50 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
51. Operadores de relaci´onylo´gicos
Sistemas Operativos El Lenguaje de programaci´on C 51 / 218
► Operadoresderelaci´on
< menor que
<= menoro igual que
> mayor que
>= mayoroigual que
= = igual a
! = distinto
52. ► Operadores l´ogicos
&& AND
|| OR
! NOT
► Losoperadoresl´ogicosseevalu´andeizquierda aderecha,y se
detiene la evaluaci´on tan pronto como se conoce elresultado.
Por ejemplo
i<MAXIMO && (linea[i]=getchar())!=’n’ && linea[i]!=EOF
Comprobar´ıa primero quei esmenorqueMAXIMO; si lo es
asigna el valor quedevuelve getchar() alinea[i] y comprueba
queesdistinto defin de l´ınea.y enesecasocompruebaque
linea[i] no es EOF
Sistemas Operativos El Lenguaje de programaci´on C 52 / 218
53. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 53 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
54. Conversiones de tipo
Sistemas Operativos El Lenguaje de programaci´on C 54 / 218
► Cuandoenunaoperaci´onaparecentipos distintos, el C
convierte el tipo demenorrango al tipo demayorantesde
realizar laoperaci´on
► Podemosforzar la conversi´ondetipos poniendo antesdela
variable el tipo al quequeremosconvertir.
► Por ejemplo, la funci´onsin esperaun argumento detipo
double. Podemospasarleuna variable entera haciendo una
conversi´on de tipo
double seno; int n;
seno= sin ((double) n);
...
double centigrados, fahrenheit=55.3;
centigrados = 5/9 * (fahrenheit - 32); //77F = 25C
centigrados = 5.0/9 * (fahrenheit - 32);
55. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 55 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
56. Operadores de bit
Sistemas Operativos El Lenguaje de programaci´on C 56 / 218
► Podemosoperar sobrelos bits deuna variable entera (las
variables char sonun tipo deenteros). Todossonoperadores
binarios, excepto el complemento a 1
& AND bit abit
| ORbit a bit
ˆ XOR bit abit
<< Desplazamiento debits ala izquierda
>> Desplazamiento debits ala derecha
˜ Complemento a1
57. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 57 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
58. Incremento y decremento, asignaci´on y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 58 / 218
► Losoperadoresincremento (++) y decremento(−−) pueden
usarsedentro deexpresiones.Si precedenala variable, el
incremento odecrementoseproduce antesdeusarla, encaso
contrario despu´es.Ejemplo:
linea[i++]=’a’;
asigna alinea[i] el valor ’a’ y luego incrementael valor dei,
mientras que
linea[--i]=’z’
primero decrementael valor dei y luego le asigna alinea[i] el
valor ’z’
► Cuandosemodifica el valor deunavariable apartir deun
valor anterior, puedeescribirsedeforma m´ascompacta
► xOPERADOR =expresi´on;equivale ax=x OPERADOR
(expresi´on);
59. x+=expresion; equivale a x=x+expresi´on;
x-=expresi´on; equivale a x=x-expresi´on;
x*=expresion; equivale a x=x*expresi´on;
Sistemas Operativos El Lenguaje de programaci´on C 59 / 218
. . .
x>> =expresion; equivale a x=x>>expresi´on;
x&=expresi´on; equivale a x=x&expresi´on;
. . .
x+=2; /*x=x+2*/
x*=4+y; /*x=x*(4+y)*/
60. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 60 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
61. Expresi´on condicional
Sistemas Operativos El Lenguaje de programaci´on C 61 / 218
► Esdela forma expre1?expre2: expre3
► Seevalu´anexpre1, si escierta (distinta de0) el resultadoeslo
quevalga expre2
► Si es0, el resultado eslo quevalga expre3
► Ejemplos
char * a;
a= (p==NULL)? "cadena1": gets(p);
int n;
n= i*j*k ? 2567: (int) sqrt (pi);
printf ("Resultado: %sn" (p!=NULL)? p:" error");
62. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 62 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
63. Precedencia y orden e evaluaci´on
Sistemas Operativos El Lenguaje de programaci´on C 63 / 218
► El Cno especificaenqueordenseevalu´anlos operandos de una
expresi´on. Por ejemplo, enla expresi´onx = f() + g () no
sabemossi seevaluar´aprimero f() og()
► El Ctampoco especifica enqueordenseevalu´anlos
par´ametrosaunafunci´on,
printf (‘‘%d %d’’,++i,i)
produce un resultado indeterminado
► Lasoperacionesl´ogicasseevalu´andeizquierda aderechay se
detiene la evaluaci´ontan pronto comoseconozca elresultado
► El Cs´ıdefine unaprecedencia entre distintos operadores,
Adem´ascadaoperador tiene unaasociatividad, comopuede
verseenla tabla siguiente
65. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 65 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
66. Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 66 / 218
► Escribir un programa enCquenosimprima los taman˜osde
todos los tipos dedatos
► Escribir una funci´onInvierteBitsC queinvierte los bits deun
caractersinsigno
► Escribir una funci´onInvierteBitsS queinvierte los bits deun
entero corto sin signo.
► Escribir una funci´onInvierteBitsL queinvierte los bits deun
entero largo sin signo
► Hacer un programa queimprima los enterosdel 0al 100y el
resultado deinvertir losbits
► Considerando los nu´merosdel 0 al 100 como caracteressin
signo
► Considerando los nu´merosdel 0 al 100 como enteros cortos sin
signo
► Considerando los nu´meros del 0 al 100 como enteros largos sin
signo
67. Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 67 / 218
68. Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 68 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
69. ► Una expresi´onseguidaenun ; esunasentencia
► Toda sentencia debeir terminada con;
► Puedenir varias sentencias enuna misma l´ınea
► Lasllaves{}seempleanparaagrupar sentencias.enlo que se
denomina bloque
► Un bloque essint´acticamenteequivalente auna sentencia
► Dentro deun bloque puedehaber sentencias y declaraciones
Sistemas Operativos El Lenguaje de programaci´on C 69 / 218
70. Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 70 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
71. if else
Sistemas Operativos El Lenguaje de programaci´on C 71 / 218
if (expresi´on)
sentencia1
else
sentencia2
► Seevalu´aexpresi´on.Si esdistinta de0 (cierta) seejecuta
sentencia1, si es0seejecutasentencia2
► El elsees opcional
► Tanto sentencia1 comosentencia2 puedenserun bloque se
sentencias entre llaves {}
► Expresi´onno termina con ;
72. ► Dado queel elseesopcional, unasentencia elsesiempreva
conel if inmediatamente anterior
► El siguiente c´odigoesincorrecto
if (n>0)
if (a>b)
printf ("a es mayor que bn");
else
printf ("n es menor que 0n");
► La versi´oncorrectaser´ıa
if (n>0) {
if (a>b)
printf ("a es mayor que bn");
}
else
printf ("n es menor que 0n");
Sistemas Operativos El Lenguaje de programaci´on C 72 / 218
73. Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 73 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
74. else-if
Sistemas Operativos El Lenguaje de programaci´on C 74 / 218
if (expresi´on1)
sentencia1
elseif(expresi´on2)
sentencia2
elseif(expresi´on3)
sentencia3
. ..
else
sentencian
► Permite tomar decisionesmu´ltiples
► Seevalu´anen orden
75. Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 75 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
76. switch
Sistemas Operativos El Lenguaje de programaci´on C 76 / 218
switch(expresi´on){
case constante1: sentencias
case constante2: sentencias
caseconstante3: sentencias
. ..
default: sentencias
}
► Permite tomar una decisi´onmu´ltiple basadaenuna expresi´on
quepuedetomar un nu´merodevalores constantes enteros (los
char sonun tipo de entero)
► El valor deexpresi´onseva comparandoconlas constantes por
ordeny una vezquecoincide con unadeellas seejecutan todas
las sentencias (incluidas las delos cases siguientes) hasta quese
encuentra la sentencia break
► Esto permite agrupar varios valores constantesquecompartan
una mismaacci´on
► Si no queremosquepasedeun case al siguiente, debemos
terminarlo conbreak
77. #include <stdio.h>
main() /* count digits, white space, others */
{
int c, i, nwhite, nother, ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; i++)
ndigit[i] = 0;
while ((c = getchar()) != EOF) {
switch (c) {
case ’0’: case ’1’: case ’2’: case ’3’: case ’4’:
case ’5’: case ’6’: case ’7’: case ’8’: case ’9’:
ndigit[c-’0’]++;
break;
case ’ ’:
case ’n’:
case ’t’:
nwhite++;
break;
default:
nother++;
break;
}
}
printf("digits =");
for (i = 0; i < 10; i++)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %dn", nwhite, nother);
return 0;
}
Sistemas Operativos El Lenguaje de programaci´on C 77 / 218
78. Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 78 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
79. bucleswhile, for ydo..while
Sistemas Operativos El Lenguaje de programaci´on C 79 / 218
while (expresi´on)
sentencia
► Seevalu´aexpresi´on, y si esdistinta de0 seejecutasentencia
► sentencia debeestarterminada por ;
► sentencia puedeserun bloque sesentencias entre llaves { }
80. int strlen(char s[])
{
int i;
i=0;
while (s[i]!= ’0’)
++i;
return i;
}
Sistemas Operativos El Lenguaje de programaci´on C 80 / 218
81. for (expr1; expr2;expr3)
sentencia
► Equivale exactamente a
expr1;
while (expr2){
sentencia
expr3;
}
► La expresiones del for, adiferencia deotros lenguajes, no
tienen por queserreferidas aenteros, puedenserexpresiones
decualquier tipo
Sistemas Operativos El Lenguaje de programaci´on C 81 / 218
82. int atoi(char s[])
{
int i, n;
n=0;
for(i=0; s[i]>=’0’ && s[i]<=’9’; ++i)
n=10*n+(s[i]-’0’);
return n;
}
Sistemas Operativos El Lenguaje de programaci´on C 82 / 218
83. do
sentencia
while (expresi´on)
► Seejecutasentencia y despu´esseevalu´aexpresi´on, conlo que
sentencia seejecuta al menosuna vez
► sentencia debeestarterminada por ;
► sentencia puedeserun bloque sesentencias entre llaves { }
Sistemas Operativos El Lenguaje de programaci´on C 83 / 218
84. Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 84 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
85. break ycontinue
Sistemas Operativos El Lenguaje de programaci´on C 85 / 218
► Cproporciona dosmodosdesalida delos bucles: break y
continue
break Provoca la salida del bucle. Si hayvarios bucles anidados
provoca la salida deaquel dondeseencuentra
continue Provoca la salida dela presenteiteraci´on del bucle. Sevuelve ala
condici´on.
► break seutiliza tambi´enparala salida del switch
int i;
for (i=1;i<10;i++) {
if (i)
continue; //break;
printf("n i vale %d",i);
}
86. Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 86 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
87. goto yetiquetas
Sistemas Operativos El Lenguaje de programaci´on C 87 / 218
► Aunque no sonformalmente necesarias,ni convenientes, C
disponedeuna sentencia goto y etiquetas
► Unaetiqueta tiene el mismo formato queun nombrede
variable, seguidadedos puntos
► Debeestarenla mismafunci´onendonde seencuentra el goto
for ( ... )
for ( ... ) {
for ( ... ) {
...
if (disaster)
goto error;
}
...
error:
/* clean up the mess */
88. Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 88 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
89. Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 89 / 218
► Escribir una funci´onenCConvierteAEnt, queapartir deuna
cadenadecaracteresquecontiene la representaci´on deun
entero enunabase,y dicha basenosdevuelve elentero
► Escribir una funci´on en C ConvierteACad, que a partir de un
entero y una base nos devuelve una representaci´on de entero
endicha base
► Comprobar quesoncorrectas
► Podemossuponer quela longitud m´aximadela cadenaes16
► hacer un programa en Cque a imprima todos los enteros del 32
al 64 en todas las basesde 2 a 16. Imprime un entero (en las 16
bases)por l´ınea
90. Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 90 / 218
91. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 91 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
92. funciones
► Un programa eCesuna colecci´onde funciones.
► Una deesasfuncionessellama main y esla primeraen
ejecutarse
► Lasfuncionespuedenresidir enuno ovarios ficheros fuente
► Cadafunci´ontiene la forma
tipo dedato nombrefuncion (declaraciones argumentos)
{
declaraciones y sentencias
}
► Sepuedeomitir el tipo dedato quedevuelve la funci´on(en
esecasoseasumequeesint
Sistemas Operativos El Lenguaje de programaci´on C 92 / 218
93. ► Una funci´onpuedeno tener argumentosono tener
declaraciones o sentencias
funcion_simple()
{
}
► Cuandounafunci´onno lleva par´ametrosono devuelve ningu´n
valor seusael t´ermino void
void funcion_nada(void)
Sistemas Operativos El Lenguaje de programaci´on C 93 / 218
94. #include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int max)
int strindex(char source[], char searchfor[]);
char pattern[] = "ould"; /* pattern to search for */
/* find all lines matching pattern */
main()
{
char line[MAXLINE];
int found = 0;
while (getline(line, MAXLINE) > 0)
if (strindex(line, pattern) >= 0) {
Sistemas Operativos El Lenguaje de programaci´on C 94 / 218
95. printf("%s", line);
found++;
}
return found;
}
/* getline: get line into s, return length */
int getline(char s[], int lim)
{
int c, i;
i = 0;
while (--lim > 0 && (c=getchar()) != EOF && c != ’n’)
s[i++] = c;
if (c == ’n’)
s[i++] = c;
s[i] = ’0’;
return i;
Sistemas Operativos El Lenguaje de programaci´on C 95 / 218
96. }
/* strindex: return index of t in s, -1 if none */
int strindex(char s[], char t[])
{
int i, j, k;
for (i = 0; s[i] != ’0’; i++) {
for (j=i, k=0; t[k]!=’0’ && s[j]==t[k]; j++, k++)
;
if (k > 0 && t[k] == ’0’)
return i;
}
return -1;
}
Sistemas Operativos El Lenguaje de programaci´on C 96 / 218
97. ► Lasfuncionesdevuelven valores mediante la sentenciareturn
► El formato es
return expresi´on;
o
return (expresi´on);
► expresi´onseconvierte al tipo dedato quedevuelvela funci´on
► Puedeaparecerencualquier parte deuna funci´ony provoca la
inmediata salida de ella
► Si dicha sentencia aparecedentro deun bucle provoca la salida
dela funci´ony por tanto del bucle
Sistemas Operativos El Lenguaje de programaci´on C 97 / 218
98. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 98 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
99. funciones que no devuelven enteros
Sistemas Operativos El Lenguaje de programaci´on C 99 / 218
► Casumequetoda funci´on,salvoqueseespecifiqueen
contrario, devuelve un entero
► Si tenemosunafunci´onquedevuelve un valor queno esun
entero, y sobretodo, si la definici´ondedicha funci´onaparece
enel c´odigodespu´esdela primeravezqueesllamada, debemos
declararla
► Esto sehacedeclarando el tipo quedevuelve la funci´on.
► Podemosdeclarar tambi´enlos par´ametrosquerecibe, as´ıel
compilador podr´acomprobar la sintaxis cuandoes llamada
► En el ejemplo siguiente podemos ver quesedeclaran los
valores devueltos por las funciones llamadas desde main
100. #include <stdio.h>
#include <ctype.h>
#define MAXLINE 100
/* rudimentary calculator */
main()
{
double sum, atof(char []); //<-- Declaraci´on funci´on
char line[MAXLINE];
int getline(char line[], int max);
sum = 0;
while (getline(line, MAXLINE) > 0)
printf("t%gn", sum += atof(line));
return 0;
}
Sistemas Operativos El Lenguaje de programaci´on C 100 / 218
101. double atof(char s[])
{ double val, power; int i, sign;
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
sign = (s[i] == ’-’) ? -1 : 1;
if (s[i] == ’+’ || s[i] == ’-’)
i++;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - ’0’);
if (s[i] == ’.’)
i++;
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - ’0’);
power *= 10;
}
return sign * val / power;
}
Sistemas Operativos El Lenguaje de programaci´on C 101 / 218
102. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 102 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
103. Variables externas
Sistemas Operativos El Lenguaje de programaci´on C 103 / 218
► Variables externas sonlas queest´andefinidas fuera del cuerpo
decualquier funci´on
► Soncompartidas por todos las funciones enmismofichero
fuente desdedonde est´adefinida la variable hasta el final del
fichero
► En C, las variables definidasdentro debloquessellaman
autom´aticas, secreanautom´aticamentecuandocomienzala
ejecuci´on del bloque y sedesasignan al terminar dicha
ejecuci´on
104. ► El dominio (zona donde se reconoce el nombre) de las
variables autom´aticas se reduce al bloque donde est´an
declaradas
► El dominio delos argumentosaunafunci´onesdicha funci´on
► Si enun bloque interior sedeclaraunavariable conel mismo
nombrequeunaenun bloque masexterior (o unaexterna)
dentro dedicho bloque el nombreserefiere ala declarada en´el
► Si queremosqueuna variable externa seacompartida por
varios ficherosfuente distintos, debedefinirseenuno deellos y
enlos otros declararla conelidentificador extern
Sistemas Operativos El Lenguaje de programaci´on C 104 / 218
105. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 105 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
106. Variables est´aticas
Sistemas Operativos El Lenguaje de programaci´on C 106 / 218
► Una variable est´aticaesunavariable local deunafunci´onque
no secreay destruye al llamar ala funci´on
► Sedeclarananteponiendo la palabra static ala declaraci´on
void funcioncilla (void)
{
static int veces=0;
++veces
printf ("Esta funcion ha sido llamada %dn" veces);
}
► Desdeel punto devista del almacenamiento,unavariable
est´aticaesenrealidad unavariable externa, y el termino static la
haceprivada alafunci´on
► Si una variable externa (o unafunci´on)la declaramos static la
hacemosprivada parael fichero fuente dondeest´adefinida
107. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 107 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
108. Variables registro
Sistemas Operativos El Lenguaje de programaci´on C 108 / 218
► La declaraci´on register antes del nombre de una variable indica
al compilador que esa variable va a usarse intensamente y que
seria conveniente almacenarla enun registro dela m´aquina
register int indice;
► El compilador tiene libertad decolocarla enun registro ono
► Solo esaplicable avariables autom´aticasy par´ametrosdelas
funciones
► No puedepreguntarsepor la direcci´on deunavariable
registro, aunquedehechono sealmaceneenunregistro
109. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 109 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
110. Inicializaci´on
Sistemas Operativos El Lenguaje de programaci´on C 110 / 218
► Cpermite quelas variables seaninicializadas enla declaraci´on
► Lasvariables externasy est´aticasseinicializan unasola vez
durante lacompilaci´on
► Lasinicializaciones devariables autom´aticassonsentencias de
asignaci´on (se ejecutan)
► Lasexpresionesdeinicializaci´on debenserconocidas enel
momento dela inicializaci´on: Lasvariables externas y
est´aticassolopuedeninicializarse avalores constantes
► Losarraystambi´enpuedeninicializarse medianteuna lista de
suselementosentre llaves y separadospor,
int dias_por_mes[] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 }
► En estecasono esnecesariodeclarar la dimensi´on del array
111. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 111 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
112. Recursividad
Sistemas Operativos El Lenguaje de programaci´on C 112 / 218
► Cpermite recursividad enlas funciones,tanto directa como
indirecta
► No esnecesaria ninguna declaraci´on especial
#include <stdio.h>
/* printd: print n in decimal */
void printd(int n)
{
if (n < 0) {
putchar(’-’);
n = -n;
}
if (n / 10)
printd(n / 10);
putchar(n % 10 + ’0’);
}
113. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 113 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
114. EL preprocesador C
Sistemas Operativos El Lenguaje de programaci´on C 114 / 218
► Adem´as de la directiva #include y el uso elementaldel
#define, el preprocesador C tiene otrasfuncionalidades
► Usode#define paradefinirmacros
#define CUBO(x) x*x*x /*incorrecto CUBO (x+2)
#define CUBO(x) (x)*(x)*(x)
#define MAX(a,b) ((a>b)?a:b)
#define MAX(a,b,R) if (a > b) R=a; else R=b;
► Con#ifdef e#ifndef podemossabersi un s´ımboloha sido
definido ono. Ejemplo: prevenir queun fichero includese
incluya variasveces,(lo quedar´ıas´ımbolosduplicados)
#ifndef _UNISTD_H
#define _UNISTD_H
.....
#endif
115. ► Puede dejarsesin efecto unadefinici´on
#undef MAXIMO
► Puedecomprobarsesi sehandefinido s´ımbolosconalgu´n
valor concreto, parahacerconstrucciones m´ascomplejas
#if SYSTEM == SYSV
#define HDR "sysv.h"
#elif SYSTEM == BSD
#define HDR "bsd.h"
#elif SYSTEM == MSDOS
#define HDR "msdos.h"
#else
#define HDR "default.h"
#endif
#include HDR
Sistemas Operativos El Lenguaje de programaci´on C 115 / 218
116. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 116 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
117. Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 117 / 218
► Repartir los programasdeejemplo deestetema envarios
ficherosfuente (uno paracadafunci´on), demaneraquese
puedan compilar separadamente.Hacer los ficherosinclude
correspondientes
► Declarar unavariable externa conel mismonombreencada
fichero fuente y comprobar si eso no la misma
► Declarar todas las variables locales comoregister y compilarlo
► Hacer quela variable externa declaradaenel apartado
anterior seala mismaparatodos los ficheros
► Hacer enCuna funci´onrecursiva quecalcula enfactorial de
un nu´mero.Imprimir los 20 primerosfactoriales
118. Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 118 / 218
119. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 119 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
120. ► Un punteroesuna variable quecontiene la direcci´on deun
dato. Cproporcionadosoperadoresrelacionados conlas
direcciones dememoria
* Operadorindirecci´on. A partir deuna variable tipo puntero
nosproporciona el dato apuntado
& Operador direcci´on.A partir deuna variable nosdala
direcci´on dememoriadondesealmacenadicha variable
► Para declarar un puntero sedeclarael tipo dedato apuntado
int *p;
double *pf;
declaraque*p esun entero, por tanto p esun puntero a
entero
*pf esun double, por tanto pf esun puntero aun double
Sistemas Operativos El Lenguaje de programaci´on C 120 / 218
122. ► La declaraci´on del puntero reservamemoriaparala variable
puntero NO PARA EL OBJETO APUNTADO. Enel
ejemplo anterior sereservamemoriaparap, El accesoa*p
tiene un resultado indefinido, pudiendo resultar enun error en
tiempo deejecuci´on
► Antes deusarun puntero debemosasegurarnosqueapunta un
unadirecci´on correcta
► Asign´andolela direcci´on deuna variable. Por ejemplo
p=&i;
► Asign´andoleel valor quedevuelva una funci´onquereserve
memoriapara´el.Por ejemplo
p=(int *) malloc (sizeof (int));
► Tras utilizar el puntero, siempresedebeliberar la memoria
reservadacon malloc utilizando la funci´onfree
free(p);
Sistemas Operativos El Lenguaje de programaci´on C 122 / 218
123. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 123 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
124. Punteros y argumentos a funciones
Sistemas Operativos El Lenguaje de programaci´on C 124 / 218
► enCtodas las llamadas afunci´onsonpor valor: La funci´on
recibe siempreunacopia delo quesele pasacomo
argumento. Lasmodificaciones serealizan sobrela copia
► Lassiguiente funci´onno afecta alos argumentosquesele
pasan
void intercambia (int x, int y) /* INCORRECTA */
{
int temp;
temp = x;
x = y;
y = temp;
}
Una llamada aintercambia (a,b) no intercambiar´ıalos
valores dea y b, solo desuscopias
125. ► Si queremosquela funci´onseallamada por referencia,lo que
hacemosesquela funci´onreciba las direcciones delas variables
quequeremosmodificar, y atrav´esdeellas accedaa las
variables
void intercambia(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
► Para intercambiar dosvariables a y b la llamar´ıamos
intercambia(&a,&b);
Sistemas Operativos El Lenguaje de programaci´on C 125 / 218
126. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 126 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
127. Operaciones sobre punteros
Sistemas Operativos El Lenguaje de programaci´on C 127 / 218
► Cpermite las siguientes operaciones sobre punteros
► puntero + entero La suma (y la resta), tienen en cuenta el
taman˜o del objeto apuntado de manera que si p apunta a un
entero, p+1 apuntar´ıaal siguiente entero
► puntero - entero
► puntero = puntero Asignaci´on entre punteros
► puntero = NULL
► puntero = = NULL Comparaci´oncon NULL
► puntero != NULL
► puntero ==puntero La comparaci´onentre punteros tiene
restricciones
128. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 128 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
129. Arrays y punteros
► La declaraci´on enCdeun array es
tipo nombre array[dimension]
► La siguiente declaraci´on declaraun array de10 enteros
int a [10];
► Loselementosseaccedencomoa[0], a[1] . . .a[9]
► Loselementosdeun array sealmacenan consecutivamente en
memoria
► El nombredel array esla direcci´on del primer elemento del
array
Sistemas Operativos El Lenguaje de programaci´on C 129 / 218
130. ,
► Consideremos ahoralosiguiente
int *pa;
pa=&a[0];
► los elementosdel array a[0], a[1]...a[9] est´an
almacenadosenlas direcciones dememoria
pa,pa+1,...pa+9 por lo quepuedenseraccedidos como
*pa, *(pa+1),. ..*(pa+9)
► Dado queel nombredel array esla direcci´on del primer
elemento del array,podr´ıamoshaber hechopa=a enlugar de
pa=&a[0];
Sistemas Operativos El Lenguaje de programaci´on C 130 / 218
131. ,
► Ctambi´enadmite el accesoalos elementosdel array deesta
manera
pa[0], pa[1] pa[9]
► Hay quetener encuenta que,aunque el nombredel array esla
direcci´on del primer elementodel array,no esunavariable, sino
una constante, por lo que una sentencia del tipo
a=pb;
producir´aun error entiempo de compilaci´on
Sistemas Operativos El Lenguaje de programaci´on C 131 / 218
132. ,
► Si queremospasarun subarrayaunafunci´onpodemoshacerlo
demaneramuy sencilla. Conlas declaraciones anteriores
f(a+3);
f(&a[3]);
pasar´ıanun subarraycomenzando enel tercer elemento del
array.
► La declaraci´on delos par´ametrosenla funci´onquerecibe el
array puedeser(suponiendo queno devuelvenada)
void f (int ar[]) { ....}
o
void f (int *ar) { ....}
Sistemas Operativos El Lenguaje de programaci´on C 132 / 218
133. #include <stdio.h>
char a[2][5] = {{11,12,13,14,15},
{21,22,23,24,25}};
main() {
char *p; // puntero a char
char (*q)[5]; // puntero a un array de 5
chars char *r[5]; // array
de 5 punteros a char
p = &(a[0][0]);
printf("%dn", p[0]);
p++;
printf("%dn", p[0]);
q = &(a[0]);
Sistemas Operativos El Lenguaje de programaci´on C 133 / 218
printf("%d == %d n", q[0][0], (*q)[0]); // equivalentes
q++;
printf("%dn", q[0][0]);
p = *a;
printf("a = %ld t *a = %ld t **a = %ld n", a, *a,
**a); printf("p = %ld t *p = %ld n", p, *p);
}
134. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 134 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
135. Arrays de punteros
Sistemas Operativos El Lenguaje de programaci´on C 135 / 218
► En Cun puntero escomocualquier otra variable (en concreto es
un tipo de entero)
► Puedenhacersearrays de punteros.
► La declaraci´on
int * ar[MAX]
declaraquear esun array deMAX punteros aenteros. Los
elementosar[i] sonpunteros. El accesoa*ar[i], mientras
no inicialicemos adecuadamente los ar[i] produce un
resultado indefinido
► Dela mismamaneraqueenel apartadoanterior exist´ıauna
relaci´onmuy estrechaentre el puntero y el array,aqu´ıel
puntero equivalente al array ar se declarar´ıa
int **par;
136. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 136 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
137. Arrays multidimensionales
► Cproporciona arrays multidimensionales, aunqueseusanm´as
los arraysdepunteros.
► La declaraci´on deun arraydedosdimensioneses
tipo nombre array[dim1][dim2]
int matriz [FILAS][COLUMNAS];
► El accesoal elemento i,j esmatriz[i][j]
Sistemas Operativos El Lenguaje de programaci´on C 137 / 218
138. static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
/* day_of_year: set day of year from month & day */
int day_of_year(int year, int month, int day)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
for (i = 1; i < month; i++)
day += daytab[leap][i];
return day;
}
Sistemas Operativos El Lenguaje de programaci´on C 138 / 218
139. /* month_day: set month, day from day of year */
void month_day(int year, int yearday, int *pmonth,
int *pday)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
for (i = 1; yearday > daytab[leap][i]; i++)
yearday -= daytab[leap][i];
*pmonth = i;
*pday = yearday;
}
Sistemas Operativos El Lenguaje de programaci´on C 139 / 218
140. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 140 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
141. Punteros y arrays multidimensionales
Sistemas Operativos El Lenguaje de programaci´on C 141 / 218
► Aunque enCexisten los arrays multidimensionales, no suelen
usarsepuesesmasconveniente usarlos arrays depunteros.
La declaraci´on
int a[10][20];
declaraun array de10x20enteros(10 filas y 20columnas).
► a esla direcci´on deun bloque dondehay200 enteros. Para
accederal elementoa[1][3] tengo quesaberquecadafila tiene 20
columnas
► Si quiero pasardicho array auna funci´ontendr´ıaquepasarlela
segundadimensi´onara quepudieseaccedercorrectamente a los
enteros
int func (int arr[][20])
► Consideremos ahoraestaotra declaraci´on
int * p[10];
declaraun array de10punterosa entero
142. ► Si acadauno delos punteros le asigno memoriapara 20 enteros,
tengo denuevo una matriz de10x20 enteros ala que puedo
accedercomop[i][j].
► En memoriatengo 10bloques de20enteros cadauno (no
necesariamenteconsecutivos) (mas 10punteros)
► El accesoesm´asr´apidopuesno necesito multiplicaciones para
determinar adondeaccedo(solo sumaseindirecciones)
► A una funci´onno tendr´ıaquepasarlela segundadimensi´on
para quepudieseaccederalosenteros
► Esmasflexible, puesno todos los bloques tienen queserdel
mismotaman˜o. Esto esespecialmente interesante cuando
queremoscadenasdecaracteres
Sistemas Operativos El Lenguaje de programaci´on C 142 / 218
143. ► Enlas siguientes figuras vemosla diferencia enla disposici´on
de memoria
► Array depunteros
► Array multidimensional
Sistemas Operativos El Lenguaje de programaci´on C 143 / 218
144. ► Conestaotradeclaraci´on
int **p;
creamosun array multidimensional basado enpunteros.
► Si queremoscrearunamatriz de4filas por 6columnas,
debemosreservarmemoria parafilas y columnas
p = (int **) malloc (4 * sizeof(int *));
for (i = 0; i < 4; i++)
{
p[i] = (int *) malloc (6 * size(int));
}
Sistemas Operativos El Lenguaje de programaci´on C 144 / 218
145. // Equivalentes
Sistemas Operativos El Lenguaje de programaci´on C 145 / 218
► Accesoaelementosdela matriz
for (i = 0; i < 4; i++)
{
for (j = 0; j < 6; j++)
{
p[i][j] = 0;
*(p[i] + j) = 0;
*(*(p + i) + j) = 0;
}
}
► Para liberar la matriz
for (i = 0; i < 4; i++)
free(p[i]);
free(p);
146. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 146 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
147. Argumentos en la l´ıneadecomando
Sistemas Operativos El Lenguaje de programaci´on C 147 / 218
► Cproporciona un m´etodoparaaccederalos argumentosdela
l´ıneadecomando, atrav´esdelos par´ametrosdemain
1 Declaramosquemain tiene dospar´ametros;uno un entero y
otro un array depunteros acar´acter,dela siguiente manera
int main(int argv, char argv[])
2 Al ejecutar el programa,argc tendr´ael nu´merodeargumentos y
los argv[i] (hasta argv[argc-1])sonlos argumentosdel´ınea de
comando
► argv[0] esel nombre del programaqueseejecuta por lo quesi
argc es1, no sele han pasadoargumentos
148. #include <stdio.h>
/* echo command-line arguments; 1st version */
int main(int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++)
printf("%s%s", argv[i], (i < argc-1) ? " " : "");
printf("n");
return 0;
}
Sistemas Operativos El Lenguaje de programaci´on C 148 / 218
149. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 149 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
150. Punteros a funciones
Sistemas Operativos El Lenguaje de programaci´on C 150 / 218
► Aunque una funci´on no es una variable, si podemos usar
punteros a funciones, de manera que podemos usarlos en
arrayso pasarloscomopar´ametrosaotras funciones
► La siguientedeclaraci´on
double (*pfunc)(int,double)
declaraquepfunc esun puntero aunafunci´onquedevuelve
un double y querecibe dospar´ametros;un int y un double
char * (*pfunc)(char **)
ahorapfunc esun puntero aunafunci´onfunci´onquedevuelve un
puntero acaractery querecibe comoargumentoun array de
punteros acar´acter
► El siguiente ejemplo lo ilustramos con la funci´on qsort que
hace una ordenaci´on de l´ıneas y recibe como par´ametro un
puntero ala funci´onquecomparaunal´ıneacon otra
151. /* Qsort: sort v[left]...v[right] into increasing order */
void Qsort(void *v[], int left, int right,
int (*comp)(void *, void *))
{
int i, last;
void swap(void *v[], int, int);
if (left >= right) /* do nothing if array contains */
return; /* fewer than two elements */
swap(v, left, (left + right)/2);
last = left;
for (i = left+1; i <= right; i++)
if ((*comp)(v[i], v[left]) < 0)
swap(v, ++last, i);
Sistemas Operativos El Lenguaje de programaci´on C 151 / 218
152. swap(v, left, last);
qsort(v, left, last-1, comp);
qsort(v, last+1, right, comp);
}
Sistemas Operativos El Lenguaje de programaci´on C 152 / 218
153. ► Si quisi´esemosutilizar la siguiente funci´onparacomparar
l´ıneas
int numcmp(char *s1, char *s2)
{
double v1, v2;
v1 = atof(s1); v2 = atof(s2);
if (v1 < v2)
return -1;
else if (v1 > v2)
return 1;
else
return 0;
}
teniendo encuenta queel nombredela funci´onesun puntero a
la funci´on,la llamada ser´ıa
Qsort (lineas,MAXLINEAS, numcmp);
Sistemas Operativos El Lenguaje de programaci´on C 153 / 218
154. Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 154 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
155. Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 155 / 218
► Escribir un programa enCqueimprime todas las l´ıneasdesu
entrada est´andarquecontienen una palabra quesele pasa
como argumento
► Escribir un programa enCqueadmite comopar´ametroun
nu´meroenteroN; si el nu´meroespositivo imprime las N
primerasl´ıneasdesuentrada, y si esnegativo las (-)N u´ltimas.
► Escribir un programa enCqueordenetodas las l´ıneasquelee de
suentrada usandola funci´onqsort. Si recibe el par´ametro
-n las ordenapor longitud, encasocontrario lo hace
alfab´eticamente
156. Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 156 / 218
157. Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 157 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
158. Estructuras
► Una estructura esuna colecci´ondeuna o masvariables, no
necesariamente del mismo tipo, agrupadasbajo un solo
nombre
► Esel equivalente al registro (record) del pascal
► La declaraci´onesdela forma
struct nombre estructura {lista variables} nombre variable ;
► El nombre dela estructura puedeomitirse. Lassiguientes
declaracionesson(casi) equivalentes: todas declaran dos
estructuras (p1 y p2) cada una delas cualescontiene dos
enteros
a. struct COORDENADAS {
int x;
int y;
} p1, p2;
b. struct COORDENADAS {
int x;
int y;
};
struct COORDENADAS p1, p2;
Sistemas Operativos El Lenguaje de programaci´on C 158 / 218
159. c struct {
int x;
int y;
} p1 , p2;
► Enlas modalidades a) y b) la estructura tiene un nombre
(struct COORDENADAS) quenospodr´ıaservir paradeclarar
m´asestructuras del mismo tipo (o par´ametrosaunafunci´on)
enotra parte delprograma
► Lasestructuras puedeninicializarse enla declaraci´on al igual
queotros tipos devariables, Losvalores desusmiembros
separadospor , y entre llaves ({})
struct COORDENADAS p1={ 5,9 };
Sistemas Operativos El Lenguaje de programaci´on C 159 / 218
160. Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 160 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
161. Operaciones sobre estructuras
Sistemas Operativos El Lenguaje de programaci´on C 161 / 218
► Cpermite las siguientes operaciones sobre estructuras
► copia oasignaci´on
► accesoasusmiembros
► obtener sudirecci´on con &
► Pasarlascomo argumentosa funciones
► Serdevueltas porfunciones
► Lasestructuras no sepuedencomparar
► Para accederalos miembrosdeunaestructura usamosel
operador .
Conlas declaraciones del apartadoanterior
p1.x=3
p1.y=9;
p2.x=p2.y=0
► Una estructura puedetener miembrosqueseanasuvez
estructuras
162. Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 162 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
163. Punteros a estructuras
Sistemas Operativos El Lenguaje de programaci´on C 163 / 218
► Ctambi´enpermite punteros aestructuras.
► La declaraci´on deun puntero aunaestructura escomola de un
puntero acualquier otra variable. Sedeclarael objeto
apuntado.
►Tambi´ensonv´alidaslas distintas modalidades vistas a
struct COORDENADAS {
int x;
int y;
} *p1, *p2;
b struct COORDENADAS {
int x;
int y;
};
struct COORDENADAS *p1, *p2;
164. c struct {
int x;
int y;
Sistemas Operativos El Lenguaje de programaci´on C 164 / 218
} *p1 , *p2;
► Podemosaccederalos miembrosdeuna estructura atrav´es
del puntero dedosmaneras
► Accediendo alaestructura
(*p1).x
Lospar´entesis() sonnecesariospuesel operador . tiene
precedenciasobrela indirecci´on *
► Directamente desdeel puntero mediante el operador ->
p1->x
En general estesistema esel preferido, sobretodo cuando
usamosvariables tipo struct paracrear estructuras dedatos
(listas, pilas, ´arboles. . . )
p->siguiente->siguiente->siguiente
(*(*(*p).siguiente).siguiente).siguiente
165. ► Al igual queconlos otros punteros, la declaraci´on deun puntero
aunaestructura reservaespacioparael puntero pero NO
PARA LA ESTRUCTURA APUNTADA POR E´Lpor lo
queel accesoadicha estructura produceun resultado indefinido
(incluso un error entiempo deejecuci´on)
► Antes deaccederala estructura apuntada debemosinicializar
el puntero
► Asign´andolela direcci´on deunavariable
► Reserv´andolememoriacon alguna funci´on(p.e. malloc)
► Enel siguiente ejemplo reservamosmemoriaparaMAX
estructuras struct COORD y lo asignamosaun puntero. El
operador sizeof nosdevuelve el taman˜odela estructura
► El taman˜o deuna estructura no esnecesariamentela sumadel
taman˜o desusmiembros
struct CORD *p;
p=(struct CORD *) malloc (MAX * sizeof (struct CORD));
Sistemas Operativos El Lenguaje de programaci´on C 165 / 218
166. Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 166 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
167. Arrays de estructuras
Sistemas Operativos El Lenguaje de programaci´on C 167 / 218
► Cpermite tambi´en hacer arrays de estructuras, la sintaxis es la
misma quepara cualquier otro tipo de variable
► Los arrays de estructuras tambi´en se puede inicializar en la
declaraci´on usando llaves para cada estructura y llaves para
cadaelemento del array
struct PARNUMEROS {
int i;
double x;
} array[]={
{0, 1000.0},
{1, 3.14},
........
{100, 2.5}
};
aunque a veces por comodidad se omiten las llaves de cada
estructura
► En el siguiente ejemplo vemos una funci´on que usaun array de
estructuras para contar el nu´mero de palabras reservadas de C
queseutilizan enunfichero
169. /* count C keywords */
main()
{
int n;
char word[MAXWORD];
while (getword(word, MAXWORD) != EOF)
if (isalpha(word[0]))
if ((n = binsearch(word, keytab, NKEYS)) >= 0)
keytab[n].count++;
for (n = 0; n < NKEYS; n++)
if (keytab[n].count > 0)
printf("%4d %sn", keytab[n].count, keytab[n].word);
return 0;
}
Sistemas Operativos El Lenguaje de programaci´on C 169 / 218
170. /* binsearch: find word in tab[0]...tab[n-1] */
int binsearch(char *word, struct key tab[], int n)
{
int cond;
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high) {
mid = (low+high) / 2;
if ((cond = strcmp(word, tab[mid].word)) < 0)
high = mid - 1;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return -1;
}
Sistemas Operativos El Lenguaje de programaci´on C 170 / 218
171. Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 171 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
172. Estructuras autoreferenciadas
Sistemas Operativos El Lenguaje de programaci´on C 172 / 218
► Una estructura no puedereferenciarseasi mismaesdecir,
tener unaestructura del mismotipo comomiembro, puesto
queesto dar´ıalugar aunarecursi´oninfinita.
► Lo quesi puedetener comomiembro esuno ovarios punteros a
unaestructura desumismotipo
► Esto nospermite realizar estructuras dedatos enmemoria
struct TNODO{
struct INFO info;
struct TNODO *izq;
struct TNODO *der;
};
173. Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 173 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
174. Uniones
Sistemas Operativos El Lenguaje de programaci´on C 174 / 218
► Unauni´onesunavariable quecontiene tipos dedatos
distintos eninstantes distintos
► Permite manipular distintos tipos dedatos enla mismazona
de memoria
► Sedeclarademanerasimilar aunaestructura pero conla
palabra union
► El accesoalos miembrosdela union esconel operador . (o
conel operador -> si accedemosatrav´esdeun puntero)
union VARIOS {
int entero;
char bytes[4];
float real;
} u;
► Una union puedecontener arraysy/o estructuras. Una
estructura tambi´enpuedecontener uniones. Est´anpermitidos
tambi´enlos arrays de uniones.
175. Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 175 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
176. Campos de bits
Sistemas Operativos El Lenguaje de programaci´on C 176 / 218
► Permiten, con unavariable detipo struct tener accesodirecto a
los bits deunentero
► Conunadeclaraci´ondeestetipo
struct {
unsigned int is_keyword : 1;
unsigned int is_extern : 1;
unsigned int is_static : 1;
} flags;
podemosaccederalos bits individualmente como
flags.is_keyword=1;
flags.is_extern=0;
..
if (flags.is_static) {..
177. ► Si los bits comienzanaasignarse por la izquierda opor la
derechay otros detalles sondependientesdela
implementaci´on,por lo queesmasusualusarm´ascarasy
enterospararealizar dichastareas
#define KEYWORD 01
#define EXTRENAL 02
#define STATIC 04
int flags;
flags|=KEYWORD |EXTERN;
if (flags & STATIC) {...
Sistemas Operativos El Lenguaje de programaci´on C 177 / 218
178. Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 178 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
179. typedef
Sistemas Operativos El Lenguaje de programaci´on C 179 / 218
► Cproporciona una herramienta paraponerle nombresa tipos:
typedef
► Suusoessimilar aunadeclaraci´on devariable precedidadela
palabra typedef. Lo queir´ıaenel lugar del nombredela
variable esel nombredel tipo
typedef int * punteroEntero;
typedef struct NUEVA nueva_t;
Si ahoraquisi´eramos declarar unavariable puntero aentero y
otra detipo struct NUEVA podr´ıamoshacer
punteroEntero p;
nueva_t n;
180. Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 180 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
181. Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 181 / 218
► Implementar e C un programa que lee enteros de su entrada
est´andar y los imprime en orden inverso, utilizando una pila.
Implementar lapila
► Conun array
► Conun array de punteros
► De maneradin´amica
► Implementar una lista enCdonde cadaelemento dela lista
contiene una palabra y un entero. El programa leesuentrada
(cada l´ıneatiene unapalabra y un entero) y almacenalos
elementosenla lista ordenadospor el valor del entero.
182. Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 182 / 218
183. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 183 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
184. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 184 / 218
► El lenguaje Cesmuy pequen˜o,sin embargo,muchasdelas
tareaspodemos hacerlas por medio dela biblioteca C. por
ejemplo, usamosfuncionesdela biblioteca C para
► asignar y desasignar memoria
► manipulado decadenasy caracteres
► funciones matem´aticas
► entrada salida
► . ..
► Enlos sistemastipo UNIX la informaci´onsobrelas funciones de
la biblioteca Cest´adisponible enla documentaci´on en l´ınea
(secci´on3delas p´aginasdemanual). Por ejemplo, para obtener
informaci´onsobre printf
$ man 3 printf
oenotrossistemas
$ man -s 3 printf
185. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 185 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
186. Documentaci´on enl´ınea
Sistemas Operativos El Lenguaje de programaci´on C 186 / 218
► La informaci´onenl´ıneadeunafunci´onnosindica, adem´asde la
sintaxis dedicha funci´on,si esnecesarioalgu´nfichero includeo
hayqueindicarle alguna librer´ıa adicional
► Por ejemplo, si miramos la p´agina de manual de la funci´on
sqrt, vemos que es necesario incluir el fichero <math.h> y
queadem´ashayqueenlazarcon-lm
SQRT(3) Linux Programmer’s Manual
N
A
M
E
s q r t , s q r t f , s q r t l - square root function
SYNOPSIS
#include <math.h>
double sqrt(double x);
f l o a t s q r t f ( f l o a t x);
long double sqrtl(long double x);
Link with -lm.
. . . . .
187. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 187 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
188. Asignacio´ndememoria
Sistemas Operativos El Lenguaje de programaci´on C 188 / 218
► Para asignar memoria tenemos
void *malloc(size_t size);
► Le pasamoscomo argumento la cantidad debytes que
queremosreservar (t´ıpicamente usamossizeof para
determinarlo)
► Nos devuelve una direcci´on dememoria, como un puntero
gen´erico(void *), donde hay disponible dicha cantidad de
bytes (no m´as).Si no queremosque el compilador deun aviso al
asignarlo a, por ejemplo, un puntero aentero, debemos hacer
una conversi´onde tipo
► Cuandoya no necesitemosla memoria asignada con malloc
podemos desasignarla con
void free(void *ptr);
► Utilizar m´asmemoria dela asignada o hacer freesobreuna
direcci´onqueno ha sido obtenida con malloc produce
resultados indefinidos, t´ıpicamente un error entiempo de
ejecuci´on
► Otras funciones relacionadas: calloc, realloc
189. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 189 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
190. Funciones de caracteres
Sistemas Operativos El Lenguaje de programaci´on C 190 / 218
► La biblioteca Cproporcionaunaseriedefuncionesque
permiten tratar concaracteres.Susprototipos est´an
declarados e<ctype.h>
int isalnum(int c);
int isalpha(int c);
int isascii(int c);
int isblank(int c);
int iscntrl(int c);
int isdigit(int c);
int isgraph(int c);
int islower(int c);
int isprint(int c);
int ispunct(int c);
int isspace(int c);
int isupper(int c);
int isxdigit(int c);
191. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 191 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
192. Cadenas de caracteres
Sistemas Operativos El Lenguaje de programaci´on C 192 / 218
► EnCno existen las variable tipo cadenas(strings). Existen
► arrays decaracteres
► punteros acar´acter
► Cuandosealmacena unacadena decaracteresdebeestar
terminada por el car´actercuyo c´odigoes0(’0’) yaqueeslo
queesperanencontrar las funciones de cadenas
► Lasfuncionesdecadenasesperanunadirecci´on dememoria
(char *); comoel nombredeun array esla direcci´on donde se
almacenael array,las funciones decadenaspuedenrecibir tanto
un array comoun puntero
► Hay algunas diferencias sutiles entre el array y el puntero a
car´acter
193. ► Consideremos la siguiente declaraci´on
char a[MAX]="esto es una cadena";
► Sedeclaraun array deMAX caracteresy seinicializa a
‘‘esto es una cadena’’
► El siguiente c´odigoproduce un error de compilaci´on
a="la cadena ha cambiado de valor";
puesto queel nombredel array esla direcci´on dondecomienza el
array,y ´estano puedecambiarse
► Podr´ıamoscambiar el valor del array conuna delas funciones de
cadena
strcpy(a,"la cadena ha cambiado de valor");
Sistemas Operativos El Lenguaje de programaci´on C 193 / 218
194. ► Consideremos la siguiente declaraci´on
char *a="esto es una cadena";
► Sedeclaraun puntero y seinicializa ala direcci´on dememoria
donde est´ala constante literal ‘‘esto es unacadena’’
► El siguiente c´odigoNO produceerror decompilaci´on ni en
tiempo deejecuci´on
a="la cadena ha cambiado de valor";
seasigna al puntero la direcci´on dememoriadonde est´ala
constante literal ‘‘la cadena ha cambiado de valor’’
► Si intentamos cambiar el valor depuntero conunadelas
funciones decadena
strcpy(a,"la cadena ha cambiado de valor");
el resultado esindefinido puesto queestamosintentando
sobreescribir la cadena‘‘esto es una cadena’’ queest´a
donde el compilador hapuesto las constantes literales con
otra cadena,queadem´asesdemayorlongitud
Sistemas Operativos El Lenguaje de programaci´on C 194 / 218
195. ► Consideremos la siguiente declaraci´on
char *a;
a=(char *) malloc (MAX*sizeof (char));
asigna al puntero aunadirecci´on dememoria donde hay
espacioparaMAXcaracteres
► La sentencias
strcpy(a,"esto es una cadena");
strcpy(a,"la cadena ha cambiado de valor");
sonperfectamentecorrectas siemprey cuandoMAX sea
mayorquela longitud de‘‘la cadena ha cambiado de
valor’’ +1
► Sin embargola asignaci´on
a="la cadena ha cambiado de valor";
hacequeel valor del puntero seaahorael dela direcci´on dela
constante literal ‘‘la cadena ha cambiado de valor’’ ,
y hemosperdido la memoriaasignada con malloc
Sistemas Operativos El Lenguaje de programaci´on C 195 / 218
196. ► Cuandohacemosuna asignaci´on esunaasignaci´on entre
punteros.
► Seasignan direcciones dememoria
► No secopian cadenas
► Si queremoscopiar cadenasdebemosusarla funci´onde
librer´ıa strcpy
► Esresponsabilidaddel programador queenel sitio adondese
copia hayaespaciosuficientepara la cadenaquesequiere copiar
► El espacionecesarioesla longitud dela cadena+ 1 byte
adicional (para el caracter ’0’ quemarcael fin decadena.
► Semuestran posiblesimplementaciones delas funciones dela
librer´ıastrcpy (que copia unacadena) y strdup (que creaun
duplicado)
Sistemas Operativos El Lenguaje de programaci´on C 196 / 218
197. void strcpy(char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’0’)
i++;
}
char *strdup(char *s) /* make a duplicate of s */
{
char *p = (char *) malloc(strlen(s)+1);
if (p == NULL)
return NULL;
strcpy(p, s);
return p;
}
Sistemas Operativos El Lenguaje de programaci´on C 197 / 218
199. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 199 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
200. Entrada/salida con formato
Sistemas Operativos El Lenguaje de programaci´on C 200 / 218
► El prototipo deestasfuncionesest´aen <stdio.h>
► Si queremoshacerla entrada salida por caracteres tenemos
int getchar()
int putchar(int c)
► Para cadenasdecaracteres
char * gets(char *s)
int puts(const char *s)
► La funci´ondeentrada salida conformato esprintf(. .. ]
► El formato deprintf es
int printf(const char *format, ...)
201. format esuna cadenadecaracterescompuestapor
Sistemas Operativos El Lenguaje de programaci´on C 201 / 218
► caracteresquesoncopiadosala salida est´andar
► especificacionesdeconversi´on: comienzanconle caracter%y
terminan conun caracterde conversi´on.
► La primera especificaci´ondeconversi´on serefiere al primer
argumento despu´esdel format, la segundaal siguiente . . . .
► El significado delos caracteres enuna especificaci´on de
conversi´on es:
► - El ajuste es a la izquierda
► N.M N ancho m´ınimo (para float d´ıgitos antes del . decimal).
M nu´mero m´ınimo de d´ıgitos que se imprimir´an para un entero
(para float nu´merode d´ıgitosa la derecha del . decimal)
► h para entero corto l para entero largo
► Caracter de conversi´on
202. ► El caracterdeconversi´on especifica qu´ehayque imprimir
Sistemas Operativos El Lenguaje de programaci´on C 202 / 218
Especificaciones de conversi´on (%u, %d,...) Codigos deescape
car´acter argumento salida C´odigo salida
d,i entero entero con signo n nueva l´ınea
u entero entero sinsigno t tabulador
o entero entero en octal sinsigno b backspace
x, X entero entero en hexadecimal sin signo r retorno carro
f real real con punto ysigno ¨ comillas
e,E real notaci´on exponencial con signo ´ ap´ostrofo
g, G
c car´acter car´acter ? ?
s cad. Chars cadena de caracteres
% imprime un %
p void depende implementaci´on
ld, lu, lx, lo entero entero largo
► Por ejemplo:
printf (‘‘real: %2.4f; entero: %Xn", x,n);
imprimir´ıa algo como:
real: 3.1516; entero: FF09465
203. ► Si queremoshacerentrada con formato, utilizamos scanf
int scanf(const char *format, ...);
► La especificaci´ondelos formatos descanf escomola de printf.
► Hay quetener encuenta queenla lista deargumentosascanf
no sele suministran las variables quequeremosleer, sino las
direcciones de memoria delas variables quequeremosleer
(para queseapor referencia)
► Ejemplo
int n; char caracter;
scanf ("%d",&n);
printf ("n El cuadrado de %d es : %d",n, n*n);
scanf ("%c",&caracter);
printf ("n He le´ıdo el car´acter: %c", caracter);
Sistemas Operativos El Lenguaje de programaci´on C 203 / 218
204. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 204 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
205. Entrada/salida con formato a fichero
Sistemas Operativos El Lenguaje de programaci´on C 205 / 218
► Lasfuncionesprintf,scanf, puts, gets, putchar, getchar operan
sobrela entrada est´andary la salida est´andar.Existen funciones
totalmente an´alogasqueoperan sobre ficheros
► Losficherospodemos abrirlos confopen y cerrarlos con fclose
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *fp);
► Lasfuncionesparaentrada y salida afichero son
int fprintf(FILE *stream, const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
char *gets(char *s);
int fputs(const char *s, FILE *stream);
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
206. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 206 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
207. Entrada/salida con formato a memoria
Sistemas Operativos El Lenguaje de programaci´on C 207 / 218
► Existen tambi´enfunciones quenospermiten simplemente
hacerla entrada/salida sobrevariables enmemoria.
► Estasfunciones operan exactamente igual quelas quehemos
visto, pero requierenun argumento adicional
► Una variable tipo puntero a car´acter, donde se va a colocar la
salida formateada adecuadamente (o desde donde se pretende
leer la entrada)
int sprintf(char *str, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
208. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 208 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
209. Entrada/salida sin formato
► Quiz´ala maneramasc´omodaderealizar e/s seala delas
llamadas al sistemaenUNIX; estasllamadas simplemente leen
bytes y escribenbytes enun fichero
► Si queremosquetengan un formato espec´ıfico,podemos
formatear previamente los datos
► Para abrir un fichero
int open(const char *pathname, int flags, mode_t mode);
pathname nombre del fichero
flags modo deapertura O RDONLY, O WRONLY, O RDWR, O
CREAT O EXCL. . .
modepermisosdel fichero (solo si secreael fichero)
► Devuelve un entero (descriptor delfichero) queseusaenread
y write
Sistemas Operativos El Lenguaje de programaci´on C 209 / 218
210. ► Para leer oescribir
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
fd descriptor defichero (obtenido con open
buf direcci´on dememoriapara la transferencia dedatos
count nu´merodebytes dee/s
► Devuelven ennu´merodebytes quesehan transferido
► paracerrar el fichero
int close(int fd);
► Otras funciones relacionadas(tras abrir fichero confopen())
size_t fread (void *ptr, size_t tam, size_t n, FILE *stream)
size_t fwrite(void *ptr, size_t tam, size_t n, FILE *stream)
int fseek(FILE *stream, long desplto, int origen);
long ftell(FILE *stream);
Sistemas Operativos El Lenguaje de programaci´on C 210 / 218
211. Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 211 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
212. Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 212 / 218
► Realizar enCun programa quereciba comopar´ametroel
nombredeun fichero y generetres ficheros
► Uno quecontiene los mismoscaracteres pero enorden inverso
► Otro que contiene las mismas palabras pero en ordeninverso
► Otro que contiene las mismas l´ıneas pero en orden inverso
► Sesuponequela separaci´onentre l´ıneasestadada por una
ocurrencia del caracterfin del´ınea(’n’), y la separaci´on entre
palabraspor una om´asocurrencias del caracterespacio (’ ’) o
del caractertab (’t’)
► Puede usarsestrtok
213. Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 213 / 218
215. Depuracio´nde memoria conValgrind
Sistemas Operativos El Lenguaje de programaci´on C 215 / 218
► Valgrind esunaherramienta quepermite detectar fallos enla
gesti´onde memoria
► Usodememoriasin asignar
► Accesosincorrectos amemoria
► Memoria asignada, no liberada y perdida (memory leaks)
► Para usareldepurador
a. Compilamos con -g -O0
$ gcc -g -O0 ejercicio1.c
b. Invocamos valgrind pas´andoleel ejecutable (y suspar´ametros)
como par´ametro
$ valgrind --leak-check=full --show-reachable=yes a.out
216. Ejemplo de depuracio´nde memoria con Valgrind (I)
Sistemas Operativos El Lenguaje de programaci´on C 216 / 218
#include <stdio.h>
#include <malloc.h>
main() {
int i;
int *v;
v=(int*) malloc (10*sizeof(int));
for (i=0;i<=10;i++) // aqu´ı hay un acceso no valido!
v[i]=i*2;
for(i=0;i<10;i++) printf("%d",v[i]);
// free(v); // no se libera memoria!!!
}
217. Ejemplo de depuracio´nde memoria con Valgrind (II)
Sistemas Operativos El Lenguaje de programaci´on C 217 / 218
$ valgr ind --leak-ch eck=full --show-reachable=yes a . ou t
==27888== Memcheck, a memory er r or detector
==27888== Copyright (C) 2002-2010, and GNUGPL’d, by J u l i a n Seward e t a l .
==27888== Using Valgr ind -3.6.1 and LibVEX; rerun with -h for copyright in fo
==27888== Command: . / a . o u t
==27888==
==27888== In valid wr ite of s i z e 4
==27888== a t 0x8048448: main ( p . c: 1 1 )
==27888== Address 0x41b8050 i s 0 bytes a f t e r a block of s i z e 40 a l l oc’ d
==27888== a t 0x4025018: malloc ( i n /usr/lib/valgrind/vgpreload_memch eck -x86-linux.so)
==27888== by 0x8048428: main ( p . c : 8 )
==27888==
0 2 4 6 8 10 12 14 16 18 ==27888==
==27888== HEAPSUMMARY:
==27888== i n use a t e x i t : 40 bytes i n 1 blocks
==27888== t o t a l heap usage: 1 a l l o c s , 0 f r e e s , 40 bytes a l l oca t ed
==27888==
==27888== 40 bytes i n 1 blocks ar e d efi n i t el y l o s t i n l os s record 1 of 1
==27888== a t 0x4025018: malloc ( i n /usr/lib/valgrind/vgpreload_memch eck -x86-linux.so)
==27888== by 0x8048428: main ( p . c : 8 )
==27888==
==27888== LEAK SUMMARY:
d efi n i t el y l o s t : 40 bytes i n 1 blocks
i n d i r ect l y l o s t : 0 bytes i n 0 blocks
possibly l o s t : 0 bytes i n 0 blocks
s t i l l r each able: 0 bytes i n 0 blocks
suppressed: 0 bytes i n 0 blocks
==27888==
==27888==
==27888==
==27888==
==27888==
==27888==
==27888== For counts of detected and suppressed e r r o r s , rerun with : -v
==27888== ERRORSUMMARY:2 er r or s from 2 con texts (suppr essed: 11 from 6)
218. Ejemplo de depuracio´nde memoria con Valgrind (III)
Sistemas Operativos El Lenguaje de programaci´on C 218 / 218
Trascorregir errores
$ valgrind --leak-check=full --show-reachable=yes . / a . o u t
==12056== Memcheck, a memory error detector
==12056== Copyright (C) 2002-2010, and G
N
UGPL’d, by Julian Seward e t a l .
==12056== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==12056== Command: . / a . o u t
==12056==
0 2 4 6 8 10 12 14 16 18 ==12056==
==12056== HEAPSUMMARY:
in use a t e x i t : 0 bytes in 0 blocks
t o t a l heap usage: 1 allocs, 1 f r ees , 40 bytes allocated
==12056==
==12056==
==12056==
==12056== All heap blocks were freed - - no leaks are possible
==12056==
==12056== For counts of detected and suppressed errors, rerun with: -v
==12056== ERRORSUMMARY:0 errors from 0 contexts (suppressed: 11 from 6)