Presentación guía sencilla en Microsoft Excel.pptx
Lenguaje c
1. Sistemas Operativos El Lenguaje de programacio´n C
CENTRO DE ESTUDIOS TECNOLOGICOSY DE SERVICIOSNO.109
ESTEFANIA LOREDO CORTES
2AM PROGRAMACION
MARGARITA ROMERO ALVARADO
LENGUAJE C
SistemasOperativos
2. El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C 1 / 265
El Lenguaje de programacio´n C
Sistemas Operativos
Universidade da Corun˜a
I
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel precompilador
Depuraci´onmake
3. El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C
Ejercicios
Tipos,operadoresyexpresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
II
Conversionesde tipo
Operadoresde bit
4. El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C 3 / 265
Incrementoydecremento, asignaci´ony
expresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Control de flujo
Sentencias y bloques
if else else-if switch
bucleswhile,forydo..while
breaky continue gotoy
etiquetas
Ejercicios
5. El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C
Funcionesyestructurade un programa
III
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Arraysy punteros
6. El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C 5 / 265
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
IV
Punterosy arrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Estructuras
7. El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
BibliotecaC
BibliotecaC
8. El Lenguaje de programacio´n C
Sistemas Operativos 7 / 265
V
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasin formato
Ejercicios
9. Sistemas Operativos 8
Herramientas
Valgrind
El Lenguaje de programaci´on C
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
10. Sistemas Operativos 9 / 265
El Lenguaje de programaci´on C
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
11. Sistemas Operativos 10
El Lenguaje de programacio´n C
Caracter´ısticas del lenguaje C
I Es el lenguaje de programaci´onde prop´ositogeneral asociado
al sistemaoperativoUNIX
I Es un lenguaje de medionivel.Tratacon objetosb´asicoscomo
car´acteres,nu´meros...;tambi´encon bitsy direccionesde
memoria
I Posee unagran portabilidad
12. Sistemas Operativos 11 / 265
I Se utilizapara laprogramaci´onde sistemas:construcci´onde
interpretes,compiladores,editoresde texto,etc
El Lenguaje de programacio´n C
I El lenguaje Cconstade
I El lenguaje C propiamente dicho: tipos de datos, expresiones y
estructuras de control
I Extensiones en forma de macros y un amplio conjunto de
librer´ıas predefinidas
13. Sistemas Operativos 12
El Lenguaje de programaci´on C
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
14. Sistemas Operativos 13 / 265
El Lenguaje de programacio´n C
Estructura de un programa C
I Un programae C consta de unoo m´as m´odulos(ficheros
fuentes)
I Cada m´odulopuede contener
I directivas del precompilador,p.epara “incluir”otros ficheros
(#include) y “definir” constantes y macros (#define)
I declaraciones devariables y prototipos de funciones
I una o m´as funciones
I comentarios
I Cada funci´onpuede contener
I directivas del precompilador
15. Sistemas Operativos 14
I declaraciones
I uno o m´as bloques
I comentarios
El Lenguaje de programacio´n C
I Cada bloque puede contener
I directivas del precompilador
I declaraciones
I una o m´as sentencias
I comentarios
16. Sistemas Operativos 15 / 265
El Lenguaje de programaci´on C
I Cada sentenciadebe estarterminadapor;
I Cada bloque de sentenciasse encierraentre llaves {... }
I La funci´ondenominadamaineslaque primerose ejecuta I Los
comentariospuedenaparecerencualquierlugardel c´odigoyse
insertanentre /*y */ as´ı
/* estoes uncomentario*/
I o entre // y final de l´ınea
// estoesotro comentario
17. Sistemas Operativos 16
El Lenguaje de programaci´on C
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
19. Sistemas Operativos El Lenguaje de programacio´n C 18
Primeros ejemplos
#include <stdio.h>main() { printf("hola,primer
programa enCn");
}
#include <stdio.h>main() { int fahr,celsius;
intlower,upper,step;lower=0;upper=300;
step=20; fahr=lower;while(fahr<=upper) {
celsius=5*(fahr-32)/9;
20. Sistemas Operativos 19 / 265
printf("%dt%dn",fahr,celsius);
fahr=fahr+step;
}
}
El Lenguaje de programaci´on C
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
21. Sistemas Operativos El Lenguaje de programacio´n C 20
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
Compilacio´n de un programa
I Normalmente invocamosal compiladorconcc o gcc (el
compiladorde gnu)
I Cuandotecleamoscc programa.cpara generarun ejecutablea
partir de un ficherofuente obtenemosunejecutable,
t´ıpicamente denominadoa.out.Sinembargose realizantres
tareas
22. Sistemas Operativos 21 / 265
I Paso por el preprocesador C. Es el que procesa las l´ıneas que
comienzan con # (pe #include,#define...). Puede invocarse
directamente con cpp
I La compilaci´on propiamentedicha.Genera ficheros objeto (.o) a
partir de los ficheros fuente. Puede invocarsecomo cc -c
I El enlazado. Realizado por ld
El Lenguaje de programaci´on C
23. Sistemas Operativos El Lenguaje de programacio´n C 22
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
24. Sistemas Operativos 23 / 265
Directivas del precompilador
#includeIncluyeel fichero,cuyo nombre se indica,para su compilaci´on con
el resto del c´odigo
I Si el nombre del fichero va entre <...> se busca en el directorio
include del sistema (/usr/include). Porejemplo
#include <stdio.h>
hace que el fichero /usr/include/stdio.h se incluya enese punto
para sercompiladocon nuestroficherofuente
I El nombre se puede ponerentre comillas(“) yel sistema lobuscar´a
en el directorioactual (tambi´ense puede poneruna ruta
absoluta)
25. Sistemas Operativos El Lenguaje de programacio´n C 24
I Los ficheros se suelen denominar.h ycontienendeclaraciones de
tipos, variablesy prototipos de funciones (sonficheros fuente
que puedenverse)
El Lenguaje de programacio´n C
#define Define un s´ımbolo,es decir cada ocurrencia deese s´ımbolo es
sustituida por su definici´on.Por ejemplo
I El C distingue entre mayu´sculas y minu´sculas, aunque la
costumbre es utilizarmayu´sculas para los s´ımbolos definidos por
el preprocesador I ejemplo
#define MAX1024
hace que todaslas ocurrencias de la cadena MAXdentro del
co´digosonsustituidas por1024
26. Sistemas Operativos 25 / 265
I El co´digoque se compila lleva 1024 donde iba MAX
I Si MAXiba dentro de comillas ’’...‘‘, no se sustituye
28. Sistemas Operativos El Lenguaje de programaci´on
C 27 / 265
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde un programa
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
29. Sistemas Operativos El Lenguaje de programacio´n C
28 / 265
Depuracio´n
I Para depurar programas disponemos del depurador, que nos
permite ejecutar los programas en un entorno controlado
I Para usar el depuradora
Compilamos con cc -g
$gcc -g ejercicio1.c b Invocamos el depurador
pas´andoleel ejecutablecomo par´ametro
antonio@abyecto:~$ gdb a.out
GNU gdb (GDB) 7.3-debian
Copyright (C) 2011 Free Software Foundation,Inc. .......
(gdb)
30. Sistemas Operativos El Lenguaje de programaci´on
C 29 / 265
I Dentro del depurador podemos establecer puntos de ruptura con
break (break numerol´ınea o break nombrefunci´on), ejecutar
paso a paso con step o next, ver variables con display .... El
depurador disponede ayuda en l´ınea,mediante help
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
31. Sistemas Operativos El Lenguaje de programacio´n C
30 / 265
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
make
I Facilitael procesode generaci´onyactualizaci´onde un
programa.
I Determinaautom´aticamente qu´e partesde un programa deben
recompilarse ante una actualizaci´on de algunos m´odulos y las
recompila.
32. Sistemas Operativos El Lenguaje de programaci´on
C 31 / 265
I Se crean un archivo Makefile conlasdependenciasentre los
ficheros:unficherodebe actualizarsesi algunade sus
dependenciasesm´asreciente
I El Makefile define tambi´enlos mandatosnecesariospara
actualizarcada archivoen base a sus dependencias
33. Sistemas Operativos El Lenguaje de programaci´on C 32 /
265
I El Makefile estaformadoporunaserie de reglas.Donde cada
regla tiene el siguiente formato objetivo: dependencia1
dependencia2 ...
mandato1
mandato2
mandato3
...
I N´otese que antesde cada mandatohay uncaracter tab
I Para compilarusamoslaorden‘‘make objetivo’’que
I Encuentra la regla correspondientea objetivo
I Trata sus dependencias como objetivos y las resuelverecursivamente
34. Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on
C 33 / 265
I Dentrodel Makefile se puedendefinirvariables(yaccederasus
valores) comoenel shell: VAR=valorparadefinirlavariable y
${VAR}o $(VAR) para accedera su valor.$@ se refiere al
nombre del objetivo
I Consideremosel siguiente programa(programa.c)
#include "funcion1.h"#include
"funcion2.h"
main() { int
a=MAX1,b=MAX2;
funcion1();funcion2();
}
I Donde funcion1.h
35. Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programacio´n C 34 /
265
#define MAX1 1000 void
funcion1(void); I y
funcion2.h
#define MAX22000 void
funcion2(void); I Adem´as,
funcion1.ces#include
"funcion1.h"
voidfuncion1(void)
{ inti=MAX1;
return;
}
I y funcion2.ces#include
"funcion2.h"
36. Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on
C 35 / 265
voidfuncion2(void)
{ intj=MAX2;
return;
}
I si queremoscompilarlo,ygenerarunprogramallamado
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´ıamos programa.c dela
siguientemanera gcc -o
programa.out programa.c funcion2.o
funcion1.o
37. Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programacio´n C 36 /
265
I Cada vezque se modificase unode losarchivoshabr´ıa que repetir
alguna(o todas) de lasanteriorescompilaciones
I El siguiente archivoMakefile se ocupade decidirque hayque
compilary hacerlo
programa.out: programa.c funcion1.h funcion2.hfuncion1.ofuncion2.o gcc -o programa.out
programa.c funcion2.ofuncion1.o
funcion1.o: funcion1.h funcion1.c gcc -c
funcion1.ofuncion1.c
funcion2.o: funcion2.h funcion2.c gcc -c
funcion2.ofuncion2.c
limpiar:
rm programa.out funcion1.ofuncion2.o
38. Sistemas Operativos El Lenguaje de programacio´n
C 37 / 265
Otro ejemplo de make
CC=gcc
CFLAGS=-gOBJS2=prac2.o
aux1.oall:prac1 prac2
prac1: prac1.o aux1.ogcc -g -oprac1 prac1.o
aux1.o
prac2: $(OBJS2)
${CC} ${CFLAGS} -o$@ ${OBJS2} prac1.o
prac2.o: prac.h
39. Sistemas Operativos El Lenguaje de programacio´n C
38 / 265
clean:
rm -f prac1.o aux1.o${OBJS2}
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
40. Sistemas Operativos El Lenguaje de programacio´n
C 39 / 265
Ejercicios
Ejercicios
I Compilarlosprogramasde ejemplode estasecci´on
I Observarlassalidadel preprocesadorde cadaunode ellos I
Usar el depuradorparaejecutarpasoa pasolosdos u´ltimosy
vercomo cambiande valor lasvariablesenel bucle
I Crear un Makefile paraunarchivoy compilarloconmake
41. Sistemas Operativos El Lenguaje de programaci´on C 40
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Nombresde variables
Tiposy taman˜osde datos
42. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 41 / 265
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
43. Sistemas Operativos El Lenguaje de programaci´on C 42
Nombres de variables
I losnombresde variablespuedentenerletras,nu´merosyel
s´ımbolo’ ’.
I Debenempezarporunaletra(puedenempezarpor’ ’ perono es
recomendable puesesel criterioque usanlasrutinasde la
biblioteca)
I Puedenllevarmayu´sculasyminu´sculas.El Cdistingue entre
mayu´sculasyminu´sculas
44. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 43 / 265
I La costumbre es que las variables van en minu´scula y las
constantes en mayu´scula
I Las palabrasreservadas if,else ... no puedenusarse como
nombresde variables
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
45. Sistemas Operativos El Lenguaje de programaci´on C 44
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
46. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 45 / 265
Tipos y taman˜os de datos
I El C tiene pocostiposde datos char Un byte. Contiene un
caracter (o un nu´mero entre 0 y 255)
int Un entero. El taman˜o depende del sistema donde estemos
floatUn real
double Un real en doble precisi´on
I Adem´asint puede sershortolong y tantoint como char pueden
sersigned o unsigned
47. Sistemas Operativos El Lenguaje de programaci´on C 46
I unsigned longint, unsinged long,
I El taman˜odepende del compiladorpero intno esmenorque
shortni mayor que long
I Existe tambi´enel longlongintcon mayor rango y el longdouble
con precisi´onextendidaparalosreales
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
48. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 47 / 265
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
49. Sistemas Operativos El Lenguaje de programaci´on C 48
Constantes
I Una constante enteraes int(ejemplo12714)
I Si queremosque sealong le ponemosel sufijo’l’o’L’.
(ejemplo12714L)
I Una constante conun puntodecimal oun exponenteesun
double(ejemplos3.141516, 1e-5)
I Si queremosque seafloatle ponemosel sufijo’f’o’F’
50. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 49 / 265
(ejemplos3.141516f, 1e-5F)
I Si unaconstante enteracomienzapor0 se entiendeque est´aen
octal y si comienzapor0x o 0X enhexadecimal
I Ejemplos 034892 (octal) 0xffff4000 (hexadecimal)
51. Sistemas Operativos El Lenguaje de programaci´on C 50
I Una constante car´acter se pone entre comillassimples(ejemplo
’a’).Puede aparecerenoperacionesysuvalores el c´odigode
dichocaracter
I Una constante car´acter tambi´ense puede expresarporsu
c´odigoen octal o hexadecimal.Ejemplos:’077’(octal) o
’x3f’(hexadecimal)
I Algunasconstantesespeciales:’t’(tab) ’n’(finde l´ınea’) ’r’
retornode carro ...
I Una constante cadenase encierraentre comillasdobles
(”...“). Las cadenas en C est´an terminadas por el caracter
52. Sistemas Operativos El Lenguaje de programacio´n C 51 / 265
’0’,
I Una expresi´onconstante esunaexpresi´onque soloincluye
constantes.Puede serevaluadaentiempode compilaci´ony
serutilizadaenlugarde una constante
#define MAXIMO 1024 char linea[MAXIMO/2+20]; I Un caso
particularde constantessonlostiposenumerados.
Un tipo enumerado es una lista de valores enteros constantes
enumboolean{FALSE,TRUE};
I Salvoque se especifique otracosa,comienzanen0,as´ı FALSE
ser´ıa 0 y TRUE 1
53. Sistemas Operativos El Lenguaje de programaci´on C 52
I Tambi´enpuede especificarse el valorde comienzo
enumdias{LUNES=1, MARTES, MIERCOLES,
JUEVES,VIERNES,SABADO,DOMINGO};
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
54. Sistemas Operativos El Lenguaje de programacio´n C 53 / 265
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
55. Sistemas Operativos El Lenguaje de programacio´n C 54
Declaraciones de variables
I Todas lasvariablesdebenserdeclaradasantesde suuso. I Las
declaracionesdebenapareceral principiode cadafunci´ono
bloque de sentencias
I La declaraci´onconstade un tipode variable yuna listade
variablesseparadasporcoma
inti,j;floatx,pi;
unsignedlonglongitud,contador;
I Las variablespuedeninicializarse enladeclaraci´on
floatpi=3.1416; unsignedlong
contador=0;
56. Sistemas Operativos El Lenguaje de programacio´n C 55 / 265
I Puede utilizarse el simbol const para indicar que la variable no
puede sercambiadaconstfloat e=2.7182;
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
58. Sistemas Operativos El Lenguaje de programacio´n C 57 / 265
/ divisi´on.Si losoperandossonenterosladivisi´onesentera
% restoentero.Noadmite operandos floatodouble
El Lenguaje de programaci´on C
59. Sistemas Operativos
#include <stdio.h>
#define UPPER300
#define LOWER0 #define
STEP 20 main() { floatfahr,
celsius;fahr=LOWER;
while(fahr<=UPPER) {
celsius=5.0/9.0*(fahr-32)
printf("%ft%fn",fahr,celsius);
fahr=fahr+STEP;
}
}
El Lenguaje de programaci´on C
60. Sistemas Operativos 59 / 265
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´ony
expresiones
Expresi´oncondicional
62. Sistemas Operativos 61 / 265
<= menor o igual que>
mayor que
>= mayor o igual que
== igual a
! = distinto
El Lenguaje de programaci´on C
63. Sistemas Operativos El Lenguaje de programaci´on C 62 / 265
I Operadoresl´ogicos
&& AND ||
OR
! NOT
I Los operadoresl´ogicosse evalu´ande izquierdaaderecha,yse
detiene laevaluaci´ontanprontocomose conoce el resultado.
Por ejemplo
i<MAXIMO && (linea[i]=getchar())!=’n’&&linea[i]!=EOF
Comprobar´ıa primeroque i esmenorque MAXIMO; si lo es
asignael valorque devuelve getchar()alinea[i] ycompruebaque
64. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 63 / 265
esdistintode fin de l´ınea. y enese caso compruebaque linea[i]
no esEOF
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
65. Sistemas Operativos El Lenguaje de programaci´on C 64 / 265
Precedenciayordene evaluaci´on
Ejercicios
Conversiones de tipo
I Cuandoenuna operaci´onaparecentiposdistintos,el Cconvierte
el tipode menorrango al tipode mayor antesde realizarla
operaci´on
I Podemosforzarlaconversi´onde tiposponiendoantesde lavariable
el tipoal que queremosconvertir.
66. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 65 / 265
I Por ejemplo,lafunci´on sin esperaunargumentode tipo double.
Podemospasarle unavariable enterahaciendounaconversi´on
de tipo
double seno;intn;seno=sin((double)n);...double
centigrados,fahrenheit=55.3;centigrados= 5/9 * (fahrenheit -
32); //77F = 25C centigrados= 5.0/9 * (fahrenheit - 32);
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
67. Sistemas Operativos El Lenguaje de programaci´on C 66 / 265
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
68. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 67 / 265
Operadores de bit
I Podemosoperarsobre losbitsde unavariable entera(lasvariables
char son un tipode enteros).Todossonoperadoresbinarios,
exceptoel complementoa1
& AND bita bit
| OR bit a bit
ˆ XOR bit a bit
<< Desplazamiento de bits a la izquierda
69. Sistemas Operativos El Lenguaje de programaci´on C 68 / 265
>> Desplazamiento de bits a la derecha ˜
Complemento a 1
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
70. Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 69 / 265
Precedenciayordene evaluaci´on
Ejercicios
71. Sistemas Operativos El Lenguaje de programacio´n C 70
Incremento y decremento, asignacio´n y expresiones
I Losoperadoresincremento(++) ydecremento(−−) puedenusarse
dentro de expresiones. Si preceden a la variable, el incremento
o decremento se produce antes de usarla, en caso contrario
despu´es.Ejemplo:
linea[i++]=’a’;
asignaa linea[i] el valor’a’yluegoincrementael valorde i,
mientrasque linea[--i]=’z’
primerodecrementael valorde i yluegole asignaa linea[i]el
valor’z’
72. Sistemas Operativos El Lenguaje de programacio´n C 71 / 265
I Cuandose modificael valorde una variable apartirde un
valoranterior,puede escribirse de formam´ascompacta I
xOPERADOR=expresi´on;equivaleax=x OPERADOR
(expresi´on);
x+=expresio´n; equivale a x=x+expresio´n; x-=expresio´n;
equivale a x=x-expresio´n;
x*=expresio´n; equivale a x=x*expresio´n; .. .
x>> =expresio´n; equivale a x=x>>expresio´n;
x&=expresio´n; equivale a x=x&expresio´n; .. .
x+=2; /*x=x+2*/ x*=4+y;
/*x=x*(4+y)*/
73. Sistemas Operativos El Lenguaje de programacio´n C 72
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
74. Sistemas Operativos El Lenguaje de programacio´n C 73 / 265
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Expresio´n condicional
I Es de laforma expre1?expre2 :expre3
I Se evalu´an expre1,si escierta (distintade 0) el resultadoeslo
que valgaexpre2
I Si es0, el resultadoesloque valga expre3
I Ejemplos
75. Sistemas Operativos El Lenguaje de programacio´n C 74
char * a; a= (p==NULL)?"cadena1": gets(p);
intn; n= i*j*k? 2567: (int) sqrt(pi);printf ("Resultado:%sn"
(p!=NULL)?p:" error");
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
76. Sistemas Operativos El Lenguaje de programacio´n C 75 / 265
Operadoresde relaci´ony l´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
77. Sistemas Operativos El Lenguaje de programacio´n C 76
Precedencia y orden e evaluaci´on
I El C no especificaenque ordense evalu´anlosoperandosde una
expresi´on.Porejemplo,enlaexpresi´on x =f () + g() no
sabemossi se evaluar´aprimerof() og()
I El C tampocoespecificaenque ordense evalu´anlos
par´ametrosa una funci´on,
printf (‘‘%d%d’’,++i,i) produce un
resultadoindeterminado
I Las operacionesl´ogicasse evalu´ande izquierdaaderechayse
detiene laevaluaci´ontanprontocomose conozcael resultado I
78. Sistemas Operativos El Lenguaje de programacio´n C 77 / 265
El C s´ı define unaprecedenciaentre distintosoperadores,
Adem´ascada operadortiene unaasociatividad,comopuede
verse enlatabla siguiente
80. Sistemas Operativos El Lenguaje de programacio´n C 79 / 265
&& izquierdaaderecha
|| izquierdaaderecha
?: derechaa izquierda
=+=-=*=/=%=&=|= etc derechaa izquierda
, izquierdaaderecha
El Lenguaje de programaci´on C
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
81. Sistemas Operativos 80
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Ejercicios
I Escribirun programa enC que nos imprimalostaman˜osde
todoslostiposde datos
I Escribiruna funci´on InvierteBitsC que invierte losbitsde un
caracter sinsigno
82. Sistemas Operativos El Lenguaje de programacio´n C 81 / 265
I Escribiruna funci´on InvierteBitsS que invierte losbitsde un
enterocortosin signo.
I Escribiruna funci´on InvierteBitsLque invierte losbitsde un
enterolargosinsigno
I Hacer un programa que imprimalosenterosdel 0al 100 y el
resultadode invertirlosbits
I Considerando los nu´meros del 0 al 100 como caracteres sin signo
I Considerando los nu´meros del 0 al 100 como enteros cortos sin
signo
I Considerando los nu´meros del 0 al 100 como enteros largos sin
signo
El Lenguaje de programaci´on C
84. Sistemas Operativos 83 / 265
El Lenguaje de programaci´on C
Control de flujo
Sentencias y
bloques if elseelse-if
switch
bucleswhile,forydo..while
breaky continue gotoy
etiquetas
Ejercicios
85. Sistemas Operativos
El Lenguaje de programacio´n C
I Una expresi´onseguidaenun; esuna sentencia
I Toda sentencia debe ir terminada con ;
I Pueden ir varias sentenciasen una misma l´ınea
I Las llaves {}se empleanparaagrupar sentencias.enloque se
denominabloque
I Un bloque essint´acticamente equivalenteauna sentencia
I Dentrode unbloque puede habersentenciasydeclaraciones
86. Sistemas Operativos 85 / 265
El Lenguaje de programaci´on C
Control de flujo
Sentencias y
bloques if elseelse-if
switch
bucleswhile,forydo..while
breaky continue gotoy
etiquetas
Ejercicios
88. Sistemas Operativos El Lenguaje de programacio´n C 87 / 265
if else
if (expresi´on)
sentencia1
else
sentencia2
I Se evalu´aexpresi´on.Si esdistintade 0 (cierta) se ejecuta
sentencia1,si es0 se ejecutasentencia2
I El else esopcional
I Tanto sentencia1 comosentencia2 puedenserunbloque se
sentenciasentre llaves {}
89. Sistemas Operativos
I Expresi´onnoterminacon;
I Dado que el else esopcional,unasentencia else siempre va
con el if inmediatamente anterior
I El siguiente c´odigoesincorrecto
if (n>0)
if (a>b)
printf ("aes mayorque bn");
else
printf ("nesmenorque 0n");
I La versi´oncorrectaser´ıa
if (n>0) { if
(a>b)
90. Sistemas Operativos El Lenguaje de programacio´n C 89 / 265
printf ("aes mayorque bn");
} else
printf ("nesmenorque 0n");
El Lenguaje de programaci´on C
Control de flujo
Sentenciasybloquesif else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
Ejercicios
91. Sistemas Operativos El Lenguaje de programacio´n C 90
else-if
if (expresi´on1)
sentencia1
else if(expresi´on2)
sentencia2
else if(expresi´on3)
sentencia3 ...else
sentencian
I Permite tomardecisionesmu´ltiples
I Se evalu´anenorden
92. Sistemas Operativos El Lenguaje de programacio´n C 91 / 265
Control de flujo
Sentenciasybloquesif else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
Ejercicios
switch
switch (expresi´on) { case
constante1: sentencias case
93. Sistemas Operativos 92
constante2: sentencias case
constante3:sentencias...
default:sentencias }
I Permite tomar una decisi´on mu´ltiple basada en una expresi´on
que puede tomarunnu´merode valoresconstantesenteros(los
char sonun tipode entero)
I El valorde expresi´onse vacomparandocon lasconstantespor
ordeny una vezque coincide conunade ellasse ejecutan
todaslas sentencias(incluidaslasde los casessiguientes)hasta
que se encuentralasentenciabreak
I Esto permite agrupar varios valores constantes quecompartan
una misma acci´on
94. Sistemas Operativos El Lenguaje de programacio´n C 93 / 265
I Si no queremos que pasede un case al siguiente,debemos
terminarlo con break
El Lenguaje de programaci´on C
95. Sistemas Operativos 94
#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; }
El Lenguaje de programaci´on C
96. Sistemas Operativos 95 / 265
Control de flujo
Sentenciasybloques
if else else-if switch
bucleswhile,forydo..while
breaky continue gotoy
etiquetas
Ejercicios
97. Sistemas Operativos 96
El Lenguaje de programacio´n C
bucleswhile, for y do..while
while (expresi´on)
sentencia
I Se evalu´aexpresi´on,ysi es distintade 0 se ejecutasentencia
I sentencia debe estarterminadapor;
I sentencia puede serunbloque se sentenciasentre llaves {}
98. Sistemas Operativos 97 / 265
El Lenguaje de programacio´n C
intstrlen(chars[])
{ inti;
i=0; while (s[i]!=’0’)
++i; returni;
}
El Lenguaje de programaci´on C
for (expr1;expr2;expr3) sentencia
99. Sistemas Operativos 98
I Equivale exactamente a
expr1;while
(expr2){
sentencia
expr3;}
I La expresionesdel for,adiferenciade otroslenguajes,notienen
por que serreferidasaenteros,puedenserexpresionesde
cualquiertipo
El Lenguaje de programacio´n C
100. Sistemas Operativos 99 / 265
intatoi(chars[])
{
inti, n;
n=0; for(i=0;s[i]>=’0’&& s[i]<=’9’;++i)
n=10*n+(s[i]-’0’);
returnn;
}
El Lenguaje de programaci´on C
101. Sistemas Operativos 100
do
sentencia
while (expresi´on)
I Se ejecutasentenciaydespu´esse evalu´aexpresi´on,conloque
sentencia se ejecutaal menosuna vez
I sentencia debe estarterminadapor;
I sentencia puede ser un bloque se sentencias entre llaves {}
103. Control de flujo
Sistemas Operativos El Lenguaje de programacio´n C 10
Sentencias y bloques if else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
Ejercicios
break y continue
I C proporcionadosmodosde salidade losbucles:breaky
continue
break Provoca la salidadel bucle. Si hay varios bucles anidados
provoca la salidadeaquel donde se encuentra
104. Sistemas Operativos El Lenguaje de programacio´n C 103 / 265
continue Provoca la salidadela presente iteraci´on del bucle.Se vuelve a
la condici´on.
I breakse utilizatambi´enparalasalidadel switch
int i; for (i=1;i<10;i++) { if (i)
continue; //break;
printf("n i vale%d",i);
}
Sentencias y bloques if else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
106. Sistemas Operativos 105 / 265
goto y etiquetas
I Aunque nosonformalmente necesarias,ni convenientes,C
dispone de unasentenciagotoyetiquetas
I Una etiquetatiene el mismoformatoque unnombre de
variable,seguidade dospuntos
I Debe estaren lamismafunci´onendonde se encuentrael goto
for ( ... ) for( ...) { for (
...) {
...
if (disaster) goto
error;
}
107. Control de flujo
Sistemas Operativos 106
...error:
/* cleanup the mess*/
El Lenguaje de programaci´on C
Sentenciasybloquesif else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
Ejercicios
El Lenguaje de programacio´n C
108. Sistemas Operativos 107 / 265
Ejercicios
I Escribiruna funci´onenC ConvierteAEnt,que apartir de una
cadenade caracteresque contiene larepresentaci´onde un
enteroenunabase,y dicha base nosdevuelveel entero
I Escribiruna funci´onenC ConvierteACad,que apartirde un
enteroyuna base nos devuelve unarepresentaci´onde entero
endicha base
I Comprobar que son correctas
I Podemos suponer que la longitud m´axima de la cadena es 16 I
hacerun programaenC que a imprimatodoslosenterosdel32al
109. Control de flujo
Sistemas Operativos 108
64 en todas las bases de 2 a 16. Imprime un entero (en las 16
bases) porl´ınea
El Lenguaje de programacio´n C
110. Sistemas Operativos 109 / 265
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
111. Sistemas Operativos
El Lenguaje de programaci´on C
Funciones y estructura de un programa
funciones
funcionesque no devuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
112. Sistemas Operativos 111 / 265
El Lenguaje de programacio´n C
funciones
I Un programae C esuna colecci´onde funciones.
I Una de esasfuncionesse llama main yesla primeraen
ejecutarse
I Las funciones pueden residir en uno o varios ficheros fuente I
Cada funci´on tiene la forma tipo de dato nombre funcion
(declaracionesargumentos)
{ declaracionesy
sentencias
}
113. Sistemas Operativos
I Se puede omitirel tipode datoque devuelvelafunci´on(en
ese caso se asume que esint
El Lenguaje de programaci´on C
114. Sistemas Operativos El Lenguaje de programaci´on C 113 / 265
I Una funci´onpuede notenerargumentosonotenerdeclaraciones
o sentencias
funcion_simple() {
}
I Cuandouna funci´onnollevapar´ametrosono devuelveningu´n
valorse usael t´ermino void
voidfuncion_nada(void)
#include <stdio.h>
#define MAXLINE1000 /* maximuminputline length*/
intgetline(charline[],intmax) intstrindex(charsource[],char
searchfor[]);charpattern[] ="ould";/* patternto searchfor */
115. Sistemas Operativos 114 / 265
/* findall linesmatchingpattern*/main() {
char line[MAXLINE];intfound=0;
while (getline(line,MAXLINE) >0) if
(strindex(line,pattern)>=0) {
El Lenguaje de programacio´n C
printf("%s",line);found++;
} return
found;
}
/* getline:getline intos,returnlength*/intgetline(chars[],
intlim)
{
116. Sistemas Operativos El Lenguaje de programaci´on C 115 / 265
intc, i; i = 0;
while (--lim>0 && (c=getchar()) != EOF && c != ’n’)
s[i++] = c;
if (c == ’n’) s[i++] = c;
s[i] = ’0’; returni;
117. Sistemas Operativos El Lenguaje de programaci´on C 116 /
}
/* strindex:returnindex of tins, -1 if none */ intstrindex(chars[],
char t[])
{
inti, 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;
}
118. Sistemas Operativos El Lenguaje de programaci´on C 117 / 265
I Las funcionesdevuelvenvaloresmediantelasentenciareturn
I El formato es
return expresi´on; o
return (expresi´on);
I expresi´on se convierte al tipo de dato que devuelve la funci´on
I Puede aparecer en cualquier partede una funci´on y provoca la
inmediata salida deella
I Si dicha sentencia aparecedentro de un bucle provoca la salidade
la funci´on y por tanto del bucle
Funciones y estructura de un programa
funciones
119. Sistemas Operativos 118 /
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
El Lenguaje de programacio´n C
120. Sistemas Operativos 119 / 265
funciones que no devuelven enteros
I C asume que toda funci´on,salvoque se especifique encontrario,
devuelveunentero
I Si tenemosunafunci´onque devuelve unvalorque noesun
entero,ysobre todo,si la definici´onde dichafunci´onaparece
enel c´odigo despu´esde laprimeravezque esllamada,
debemos declararla
I Esto se hace declarandoel tipoque devuelvelafunci´on. I
Podemosdeclarartambi´enlospar´ametrosque recibe,as´ıel
compiladorpodr´acomprobarla sintaxiscuandoesllamada I
En el ejemplosiguiente podemosverque
121. Sistemas Operativos 120 / 265
se declaranlosvaloresdevueltosporlasfuncionesllamadas
desde main
El Lenguaje de programacio´n C
#include <stdio.h>
#include <ctype.h>
#define MAXLINE100 /* rudimentary calculator*/main() { double
sum,atof(char[]);//<-- Declaraci´onfunci´oncharline[MAXLINE];int
getline(charline[],intmax);
sum= 0; while (getline(line,MAXLINE) >0)
printf("t%gn",sum+=atof(line));
122. Sistemas Operativos 121 / 265
return0;
}
El Lenguaje de programaci´on C
double atof(chars[])
{ double val, power; inti, sign;
for (i = 0; isspace(s[i]);i++) /*skipwhite 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++;
123. Sistemas Operativos 122 / 265
for (power=1.0; isdigit(s[i]);i++) {
val = 10.0 * val + (s[i] - ’0’);power*= 10;
} returnsign* val / power;
}
El Lenguaje de programaci´on C
124. Sistemas Operativos 123 / 265
Funciones y estructura de un programa
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
125. Sistemas Operativos El Lenguaje de programacio´n C 124
Variables externas
I Variablesexternassonlasque est´andefinidasfueradel cuerpo
de cualquierfunci´on
I Son compartidasportodoslas funcionesenmismofichero
fuente desde dondeest´adefinidalavariablehastael final del
fichero
I En C, las variablesdefinidasdentrode bloquesse llaman
autom´aticas,se creanautom´aticamente cuandocomienzala
ejecuci´ondel bloqueyse desasignanal terminardicha
ejecuci´on
126. Sistemas Operativos 125 / 265
El Lenguaje de programaci´on C
I El dominio(zonadonde se reconoce el nombre) de lasvariables
autom´aticasse reduce al bloque donde est´andeclaradas
I El dominiode losargumentosa una funci´onesdicha funci´on I Si
enun bloque interiorse declaraunavariable conel mismonombre
que unaenunbloque masexterior(ounaexterna) dentrode dicho
bloque el nombre se refiere aladeclaradaen ´el I Si queremosque
una variable externa sea compartida por varios ficheros fuente
distintos, debe definirse en uno de ellos y en los otros declararla
con el identificadorextern
127. Sistemas Operativos El Lenguaje de programacio´n
C 126 / 265
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Variables est´aticas
I Una variable est´aticaesunavariable local de unafunci´onque no
se crea y destruye al llamara la funci´on
128. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programacio´n
C 127 / 265
I Se declaran anteponiendo la palabra static a la declaraci´on
voidfuncioncilla(void)
{ staticint veces=0;
++vecesprintf ("Estafuncionha sidollamada%dn"veces);}
I Desde el puntode vistadel almacenamiento, unavariableest´atica
esen realidadunavariable externa,yel termino staticlahace
privadaa la funci´on
I Si unavariable externa(ounafunci´on) ladeclaramos staticla
hacemosprivadapara el ficherofuente dondeest´adefinida
funciones
funcionesque nodevuelvenenteros
129. Sistemas Operativos El Lenguaje de programacio´n
C 128 / 265
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
130. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programacio´n
C 129 / 265
Variables registro
I La declaraci´onregisterantesdel nombre de unavariableindicaal
compilador que esa variable va a usarse intensamente y que
seriaconveniente almacenarlaenunregistrode lam´aquina
registerintindice;
I El compiladortiene libertadde colocarlaenunregistroono I
Soloesaplicable avariablesautom´aticasypar´ametrosde las
funciones
131. Sistemas Operativos El Lenguaje de programacio´n
C 130 / 265
I No puede preguntarse porladirecci´onde unavariable registro,
aunque de hechono se almacene enunregistro funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
132. Sistemas Operativos 131 / 265
Inicializaci´on
I C permite que lasvariablesseaninicializadasenladeclaraci´on I
Las variablesexternasyest´aticasse inicializanunasolavez
durante la compilaci´on I Lasinicializacionesde variables
autom´aticasson sentenciasde asignaci´on(seejecutan)
I Las expresionesde inicializaci´ondebenserconocidasenel
momentode lainicializaci´on:Lasvariablesexternasyest´aticas
solopuedeninicializarse avaloresconstantes I Losarrays
tambi´enpuedeninicializarsemediante unalistade sus
elementosentre llavesyseparadospor,
intdias_por_mes[] ={ 31, 28, 31, 30, 31, 30,
133. Sistemas Operativos El Lenguaje de programacio´n C 132
31, 31, 30, 31, 30, 31 }
I En este caso no esnecesariodeclararladimensi´ondelarray
El Lenguaje de programaci´on C
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
134. Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programacio´n C 133 / 265
Recursividad
I C permite recursividadenlasfunciones,tantodirectacomo
indirecta
I No esnecesarianingunadeclaraci´onespecial
#include <stdio.h>
/* printd:printn in decimal */voidprintd(int
n)
{
if (n < 0) {
putchar(’-’);
n = -n;
}
if (n / 10)
135. Sistemas Operativos El Lenguaje de programacio´n C 134
printd(n/10);
putchar(n% 10 + ’0’);
}
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
136. Sistemas Operativos 135 / 265
EL preprocesador C
I Adem´as de la directiva #include y el uso elemental del
#define,el preprocesadorCtiene otrasfuncionalidades
I Uso de #define paradefinirmacros
#define CUBO(x) x*x*x /*incorrectoCUBO (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;
I Con #ifdef e #ifndef podemossabersi uns´ımbolohasido
definidoono.Ejemplo:prevenirque unfichero includese
incluyavariasveces,(loque dar´ıas´ımbolos duplicados)
137. Sistemas Operativos 136
#ifndef _UNISTD_H
#define _UNISTD_H.....
#endif
El Lenguaje de programaci´on C
I Puede dejarse sinefectounadefinici´on
#undef MAXIMO
I Puede comprobarse si se handefinidos´ımbolosconalgu´n
valorconcreto, para hacer construccionesm´as complejas
#if SYSTEM == SYSV
#define HDR"sysv.h"
#elif SYSTEM== BSD
#define HDR"bsd.h"
#elif SYSTEM== MSDOS
138. Sistemas Operativos 137 / 265
#define HDR"msdos.h"
#else
#define HDR"default.h"
#endif
#include HDR
El Lenguaje de programaci´on C
Funciones y estructura de un programa
funciones
funcionesque nodevuelvenenteros
140. Sistemas Operativos 139 / 265
Ejercicios
I Repartirlosprogramas de ejemplode este temaen varios
ficherosfuente (unoparacadafunci´on),de maneraque se
puedancompilarseparadamente.Hacerlosficherosinclude
correspondientes
I Declarar unavariable externaconel mismonombre encada
ficherofuente ycomprobarsi eso no la misma
I Declarar todaslas variableslocalescomoregisterycompilarlo I
Hacer que la variable externadeclaradaenel apartadoanterior
seala mismapara todoslos ficheros
141. Sistemas Operativos 140
I Hacer en C unafunci´onrecursivaque calculaenfactorial de un
nu´mero.Imprimirlos20 primerosfactoriales
El Lenguaje de programacio´n C
142. Sistemas Operativos 141 / 265
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
143. Sistemas Operativos El Lenguaje de programaci´on C 1
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
El Lenguaje de programacio´n C
144. Sistemas Operativos 143 / 265
I Un punteroesunavariable que contiene ladirecci´onde un
dato.C proporcionadosoperadoresrelacionadosconlas
direccionesde memoria
* Operador indirecci´on.Apartir de una variabletipo puntero nos
proporciona el dato apuntado
& Operador direcci´on.A partir de una variablenos da la
direcci´on dememoria donde se almacena dicha variable
I Para declararun punterose declarael tipode dato apuntado
int*p; double
*pf;
declaraque *p es un entero,portantop esun punteroa
entero
*pf es un double, por tanto pf es un puntero a un double
145. Sistemas Operativos El Lenguaje de programaci´on C 144
I Organizaci´onde Memoria:Ejemplo
147. Sistemas Operativos El Lenguaje de programaci´on C 146
I La declaraci´ondel punteroreservamemoria paralavariable
punteroNOPARA EL OBJETOAPUNTADO.En el
ejemploanteriorse reservamemoriaparap, El accesoa *p
tiene unresultadoindefinido,pudiendoresultarenunerror en
tiempode ejecuci´on
I Antesde usar un punterodebemosasegurarnosque apuntaun
una direcci´oncorrecta
I Asign´andolela direcci´on deuna variable.Por ejemplo p=&i;
I Asign´andole el valor que devuelva una funci´on que reserve
memoria para ´el.Por ejemplo p=(int *) malloc (sizeof (int));
I Tras utilizar el puntero,siempre se debe liberar lamemoria
reservada con malloc utilizando lafunci´on freefree(p);
150. Sistemas Operativos El Lenguaje de programaci´on C 149 / 265
Punteros y argumentos a funciones
I enC todaslasllamadasa funci´onsonpor valor:La funci´on
recibe siempre unacopiade loque se le pasa como
argumento.Lasmodificacionesse realizansobre lacopia I Las
siguiente funci´onnoafectaa losargumentosque se le pasan
voidintercambia(intx,inty) /* INCORRECTA */
{ inttemp;
temp= x;x
= y; y=
temp;
}
151. Sistemas Operativos El Lenguaje de programacio´n C 150
Una llamadaa intercambia(a,b) nointercambiar´ıalosvalores
de a y b,solode suscopias
I Si queremosque lafunci´onseallamadaporreferencia,loque
hacemosesque la funci´onrecibalasdireccionesde las
variablesque queremosmodificar,yatrav´es de ellasaccedaa
lasvariables
voidintercambia(int*px,int*py)
{ inttemp;
temp= *px;
*px = *py;
*py = temp;
}
152. Sistemas Operativos El Lenguaje de programaci´on C 151 / 265
I Para intercambiardosvariablesayb lallamar´ıamos
intercambia(&a,&b);
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
153. Sistemas Operativos El Lenguaje de programacio´n C 152
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Operaciones sobre punteros
I C permite lassiguientesoperacionessobre punteros
I 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´ıa al siguienteentero
I puntero - entero
I puntero = puntero Asignaci´on entre punteros
154. Sistemas Operativos El Lenguaje de programaci´on C 153 / 265
I puntero = NULL
I puntero == NULL Comparaci´on con NULL
I puntero != NULL
I puntero ==puntero La comparaci´on entre punteros tiene
restricciones
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
155. Sistemas Operativos El Lenguaje de programacio´n C 154
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Arrays y punteros
I La declaraci´onenCde un array estipo
nombre array[dimension]
I La siguientedeclaraci´ondeclaraunarray de 10 enteros
inta [10];
156. Sistemas Operativos El Lenguaje de programaci´on C 155 / 265
I Los elementosse accedencomoa[0],a[1] ...a[9]
I Los elementosde unarray se almacenan consecutivamenteen
memoria
I El nombre del array esla direcci´ondel primerelementodel
array
157. Sistemas Operativos El Lenguaje de programaci´on
C 156 / 265
,
I Consideremos ahora lo siguiente
int*pa; pa=&a[0];
I loselementosdelarraya[0],a[1]...a[9] est´analmacenadosen
lasdireccionesde memoria
pa,pa+1,...pa+9 por lo que pueden ser accedidos como
*pa, *(pa+1),...*(pa+9)
158. Sistemas Operativos El Lenguaje de programaci´on
C 157 / 265
I Dado que el nombre del array esla direcci´ondel primer
elementodelarray,podr´ıamoshaberhechopa=a en lugarde
pa=&a[0];
,
I C tambi´enadmite el accesoa loselementosdel arrayde esta
manera
pa[0],pa[1] pa[9]
I Hay que tenerencuentaque,aunque el nombre del arrayes la
direcci´ondel primerelemento del array,noesuna variable,
sinouna constante,porloque una sentenciadel tipoa=pb;
producir´aun error entiempode compilaci´on
,
159. Sistemas Operativos El Lenguaje de programaci´on
C 158 / 265
I Si queremospasarunsubarraya unafunci´onpodemoshacerlo
de manera muysencilla.Conlasdeclaracionesanteriores
f(a+3);f(&a[3]);
pasar´ıan un subarraycomenzandoenel tercerelementodel
array.
I La declaraci´onde lospar´ametrosenla funci´onque recibe el
array puede ser(suponiendoque nodevuelve nada)
voidf (intar[]) { ....}
o
voidf (int*ar) { ....}
#include <stdio.h> char a[2][5] =
{{11,12,13,14,15},
{21,22,23,24,25}};
160. Sistemas Operativos El Lenguaje de programaci´on
C 159 / 265
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]); 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);
}
162. Sistemas Operativos El Lenguaje de programaci´on C 161 / 265
El Lenguaje de programacio´n C
Arrays de punteros
I En C un punteroescomo cualquierotravariable (enconcretoes
un tipode entero)
I Puedenhacerse arrays de punteros.
I La declaraci´on
int* ar[MAX]
declaraque ar esun array de MAX punterosa enteros.Los
elementosar[i] sonpunteros.El accesoa*ar[i],mientrasno
inicialicemosadecuadamente losar[i] produce unresultado
indefinido
163. Sistemas Operativos 162 / 26
I De lamismamanera que enel apartado anteriorexist´ıauna
relaci´onmuyestrechaentre el punteroyel array,aqu´ı el
punteroequivalenteal arrayar se declarar´ıa
int**par;
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
164. Sistemas Operativos El Lenguaje de programaci´on C 163 / 265
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
El Lenguaje de programacio´n C
165. Sistemas Operativos 164 / 26
Arrays multidimensionales
I C proporcionaarrays multidimensionales,aunque se usanm´aslos
arrays de punteros.
I La declaraci´onde unarray de dosdimensionesestipo
nombre array[dim1][dim2]
intmatriz [FILAS][COLUMNAS];
I El accesoal elementoi,j esmatriz[i][j]
staticchar daytab[2][13] = {
167. Sistemas Operativos 166 / 26
El Lenguaje de programaci´on C
/* month_day:setmonth,day fromday of year */
voidmonth_day(intyear,intyearday,int*pmonth,int*pday) {
inti, 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;
}
168. Sistemas Operativos El Lenguaje de programaci´on C 167 / 265
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
169. Sistemas Operativos 168 / 26
El Lenguaje de programacio´n C
Punteros y arrays multidimensionales
I Aunque enC existenlos arraysmultidimensionales,nosuelen
usarse puesesmas conveniente usarlosarraysde punteros.
La declaraci´on
inta[10][20]; declaraun array de 10x20 enteros(10 filasy
20 columnas).
I a es la direcci´on deun bloque donde hay 200 enteros. Para acceder
al elemento a[1][3] tengo que saber que cada fila tiene20
columnas
I Si quiero pasar dicho array a una funci´on tendr´ıa que pasarlela
segunda dimensi´on ara quepudiese acceder correctamente a
los enteros
170. Sistemas Operativos El Lenguaje de programaci´on C 169 / 265
int func (int arr[][20])
I Consideremosahoraestaotra declaraci´on
int* p[10];
declaraun array de 10 punterosaentero
171. Sistemas Operativos El Lenguaje de programaci´on C 170 / 265
I Si a cada uno de los punteros le asigno memoria para 20 enteros,
tengo de nuevo una matriz de 10x20 enteros a la que puedo
acceder como p[i][j].
I En memoria tengo 10 bloques de 20 enteros cada uno (no
necesariamente consecutivos) (mas 10 punteros)
I El acceso es m´as r´apido pues no necesito multiplicaciones para
determinar a donde accedo (solo sumas eindirecciones)
I A una funci´on no tendr´ıa que pasarlela segunda dimensi´on
para que pudiese acceder a los enteros
I Es mas flexible,pues no todos los bloques tienen que ser del
mismo taman˜o. Esto es especialmente interesante cuando
queremos cadenas de caracteres
172. I
Sistemas Operativos El Lenguaje de programaci´on C 171 / 265
En las siguientesfigurasvemosladiferenciaenladisposici´on
de memoria
I Array de punteros
I Array multidimensional
173. I
Sistemas Operativos El Lenguaje de programaci´on C 172 / 265
Con estaotra declaraci´on
int **p; creamos un array multidimensional basado en
punteros. I Si queremos crear una matriz de 4 filas por 6
columnas,debemosreservarmemoriaparafilasycolumnas
174. I
Sistemas Operativos El Lenguaje de programaci´on C 173 / 265
p = (int**) malloc (4 * sizeof(int*)); for (i = 0; i < 4; i++)
{ p[i] = (int *) malloc (6 * size(int));
}
175. I
Sistemas Operativos 174
Accesoa elementosde lamatriz
for (i = 0; i < 4; i++)
{
for (j = 0; j < 6; j++)
{
p[i][j] = 0; // Equivalentes
*(p[i] + j) = 0;
*(*(p + i) + j) = 0;
}
}
I Para liberarlamatriz
for (i = 0; i < 4; i++) free(p[i]);
free(p);
176. Sistemas Operativos 175 / 265
El Lenguaje de programacio´n C
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosen lal´ıneade comando
Punterosafunciones
177. Sistemas Operativos 176
Ejercicios
El Lenguaje de programacio´n C
Argumentos en la l´ınea de comando
I C proporcionaunm´etodopara acceder a losargumentosde la
l´ıneade comando,a trav´esde lospar´ametrosde main
178. Sistemas Operativos 177 / 265
1 Declaramosque main tiene dospar´ametros;unoun enteroy
otro un array de punterosa car´acter, de la siguiente manera
intmain(intargv,char argv[])
2 Al ejecutarel programa, argctendr´a el nu´merode
argumentosylos argv[i] (hastaargv[argc-1])sonlos
argumentosde l´ıneade comando
I argv[0] es el nombre del programa que se ejecuta por lo que si
argc es 1, no se lehan pasado argumentos
El Lenguaje de programaci´on C
179. Sistemas Operativos El Lenguaje de programaci´on C 178 / 265
#include <stdio.h>
/* echo command-line arguments;1stversion*/
intmain(intargc,char *argv[])
{ inti;
for (i = 1; i < argc; i++)
printf("%s%s",argv[i],(i <argc-1) ? " " : ""); printf("n");
return0;
}
181. Sistemas Operativos El Lenguaje de programaci´on C 180 / 265
El Lenguaje de programacio´n C
Punteros a funciones
I Aunque unafunci´onnoesuna variable,si podemosusar
punterosa funciones,de maneraque podemosusarlosen
arrays o pasarloscomo par´ametrosa otras funciones
I La siguientedeclaraci´ondouble
(*pfunc)(int,double)
declaraque pfuncesun punteroa unafunci´onque devuelve
un doubley que recibe dospar´ametros;un int y un double
char * (*pfunc)(char**)
182. Sistemas Operativos 181 / 265
ahora pfuncesun punteroa una funci´onfunci´onque devuelve
un punteroa caracter y que recibe comoargumentounarray de
punterosa car´acter
I El siguiente ejemploloilustramosconlafunci´on qsortque hace
una ordenaci´onde l´ıneasyrecibe comopar´ametro un
punteroa la funci´onque comparauna l´ıneacon otra
/* Qsort: sort v[left]...v[right] intoincreasingorder*/
voidQsort(void*v[], intleft,intright,int(*comp)(void*,
void*))
{ inti, last;voidswap(void*v[],int,int);
if (left>= right) /* do nothingif array contains*/ return;/* fewerthan
twoelements*/
183. Sistemas Operativos El Lenguaje de programaci´on C 182 / 265
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);
El Lenguaje de programacio´n C
swap(v,left,last);qsort(v,left,last-1,
comp);qsort(v,last+1,right,comp);
}
184. Sistemas Operativos 183 / 265
I Si quisi´esemosutilizarlasiguiente funci´onparacomparar
l´ıneas
intnumcmp(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 return0;
}
teniendoencuentaque el nombre de lafunci´onesunpuntero
a la funci´on,lallamadaser´ıa
Qsort (lineas,MAXLINEAS,numcmp);
El Lenguaje de programaci´on C
186. Sistemas Operativos 185 / 265
El Lenguaje de programacio´n C
Ejercicios
I Escribirun programa enC que imprime todaslasl´ıneasde su
entradaest´andarque contienenunapalabraque se le pasa
como argumento
I Escribir un programa en C que admite como par´ametro un
nu´meroenteroN;si el nu´meroespositivoimprime lasN primeras
l´ıneasde su entrada,y si es negativolas(-)N u´ltimas.I Escribirun
programa en C que ordene todas las l´ıneas que lee de su entrada
usandola funci´on qsort.Si recibe el par´ametro -n las ordenapor
187. Sistemas Operativos 186
longitud,encasocontrariolohace alfab´eticamente
El Lenguaje de programaci´on C
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
188. Sistemas Operativos 187 / 265
El Lenguaje de programaci´on C
Estructuras
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
190. Estructuras
Sistemas Operativos 189 / 265
I Una estructura es unacolecci´on deuna o masvariables,no
necesariamentedel mismo tipo,agrupadasbajoun solo
nombre
I Es el equivalente al registro (record) del pascal
I La declaraci´on es dela forma structnombreestructura {lista
variables} nombre variable;
I El nombrede la estructurapuedeomitirse.Lassiguientes
declaraciones son (casi) equivalentes:todasdeclarandos
estructuras(p1 y p2) cadauna delascualescontienedos
enteros
a structCOORDENADAS {int
x; inty;
} p1,p2;b struct
COORDENADAS { intx;inty;
}; structCOORDENADAS p1,
p2;
191. Estructuras
Sistemas Operativos El Lenguaje de programacio´n C 19
El Lenguaje de programaci´on C
c struct { intx;
inty;
} p1 , p2;
I En las modalidadesa) yb) laestructura tiene unnombre (struct
COORDENADAS) que nospodr´ıaservirpara declararm´as
estructurasdel mismotipo(opar´ametrosa una funci´on) en
otra parte del programa
I Las estructuras pueden inicializarse en la declaraci´on al igual
que otros tipos de variables, Los valores de sus miembros
separados por , y entre llaves ({}) struct COORDENADASp1={
5,9 };
Estructuras
192. Sistemas Operativos El Lenguaje de programaci´on C 191 / 265
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Operaciones sobre estructuras
I C permite lassiguientesoperacionessobre estructuras
I copia o asignaci´on
I acceso a sus miembros
I obtener su direcci´on con &
193. Estructuras
Sistemas Operativos El Lenguaje de programacio´n C 19
I Pasarlascomo argumentos a funciones
I Ser devueltas por funciones
I Las estructurasno se puedencomparar
I Para accedera losmiembrosde unaestructurausamosel
operador.
Con lasdeclaracionesdel apartadoanterior
p1.x=3 p1.y=9; p2.x=p2.y=0
I Una estructurapuede tener miembrosque seanasuvez
estructuras
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
194. Sistemas Operativos El Lenguaje de programaci´on C 193 / 265
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Punteros a estructuras
I C tambi´enpermite punterosa estructuras.
I La declaraci´onde unpunteroa una estructuraescomo la de un
punteroa cualquierotravariable.Se declarael objeto
apuntado.
I Tambi´ensonv´alidaslasdistintasmodalidadesvistas a
struct COORDENADAS{ intx; inty;
195. Estructuras
Sistemas Operativos El Lenguaje de programacio´n C 19
} *p1, *p2; b struct
COORDENADAS{ intx; inty;
}; struct COORDENADAS*p1,
*p2;
196. Sistemas Operativos El Lenguaje de programaci´on
C 195 / 265
c struct { intx;
inty;
} *p1 , *p2;
I Podemosaccederalos miembrosde unaestructuraa trav´esdel
punterode dosmaneras
I Accediendo a la estructura
(*p1).x
Los par´entesis () son necesarios pues el operador . tiene
precedencia sobre la indirecci´on *
I Directamente desde el puntero mediante el operador -> p1->x
En general este sistema es el preferido, sobretodo cuando
usamos variables tipo structpara crear estructuras dedatos
(listas,pilas,´arboles ...)
197. Sistemas Operativos El Lenguaje de programacio´n C
196 / 265
p->siguiente->siguiente->siguiente
(*(*(*p).siguiente).siguiente).siguiente
I Al igual que con losotros punteros,ladeclaraci´onde unpunteroa
una estructurareservaespacioparael punteropero
NO PARA LA ESTRUCTURA APUNTADA POR EL´ por lo que el
acceso a dicha estructura produce un resultado indefinido
(inclusounerrorentiempode ejecuci´on)
I Antesde accedera la estructuraapuntadadebemosinicializarel
puntero
I Asign´andolela direcci´on deuna variable
I Reserv´andolememoria con alguna funci´on (p.e. malloc)
198. Sistemas Operativos El Lenguaje de programaci´on
C 197 / 265
I En el siguiente ejemploreservamosmemoriaparaMAX
estructurasstruct COORDy lo asignamosa un puntero.El
operadorsizeof nosdevuelveel taman˜ode laestructura
I El taman˜o de una estructura no es necesariamente la suma del
taman˜o de sus miembros
structCORD *p; p=(struct CORD *) malloc (MAX * sizeof (struct
CORD));
Estructuras
Estructuras
Operacionessobre estructuras
199. Sistemas Operativos El Lenguaje de programacio´n C
198 / 265
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Arrays de estructuras
I C permitetambi´en hacerarraysdeestructuras,lasintaxises la
misma quepara cualquier otrotipo devariable
I Los arrays de estructuras tambi´en se puede inicializar en la
declaraci´on usando llaves paracada estructuray llavespara
cada elemento del array structPARNUMEROS {
200. Sistemas Operativos El Lenguaje de programaci´on
C 199 / 265
inti;doublex;}
array[]={
{0,1000.0},
{1,3.14},........
{100,2.5}
}; aunquea veces por comodidad seomiten lasllavesde
cada estructura
I En el siguienteejemplo vemos unafunci´onqueusaun array de
estructurasparacontar el nu´mero depalabrasreservadasdeC
quese utilizan en un fichero
205. Sistemas Operativos El Lenguaje de programacio´n C 204
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
206. Estructuras
Sistemas Operativos El Lenguaje de programacio´n C 205 / 265
Estructuras autoreferenciadas
I Una estructuranopuede referenciarse asi mismaesdecir,tener
una estructuradel mismotipocomomiembro,puesto que esto
dar´ıa lugara unarecursi´oninfinita.
I Lo que si puede tenercomomiembroesunoovariospunterosa
una estructurade su mismotipo
I Esto nospermite realizarestructurasde datosenmemoria
207. Sistemas Operativos El Lenguaje de programacio´n C 206
struct TNODO{ struct INFO
info;structTNODO
*izq;struct TNODO
*der;
};
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
209. Sistemas Operativos 208
Uniones
I Una uni´onesuna variable que contiene tiposde datosdistintos
eninstantesdistintos
I Permite manipulardistintostiposde datosenlamismazonade
memoriaI Se declarade manerasimilara una estructurapero
con la palabraunion
I El acceso a losmiembrosde launionescon el operador. (o con
el operador -> si accedemos a trav´es de un puntero) union
VARIOS{ intentero;char bytes[4];floatreal;
} u;
210. Estructuras
Sistemas Operativos 209 / 265
I Una union puede contenerarraysy/oestructuras.Una
estructuratambi´enpuede conteneruniones.Est´an
permitidostambi´enlosarraysde uniones.
El Lenguaje de programaci´on C
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
211. Sistemas Operativos 210
El Lenguaje de programacio´n C
Campos de bits
I Permiten,conunavariable de tipostructteneraccesodirectoa
losbitsde unentero
I Con una declaraci´on de este tipo struct {
unsignedintis_keyword:1; unsignedint
is_extern:1; unsignedintis_static:1;
} flags;
podemosaccedera los bitsindividualmente como
flags.is_keyword=1; flags.is_extern=0; .. if
(flags.is_static) {..
213. Sistemas Operativos 212
I Si losbitscomienzanaasignarse porla izquierdaoporla
derechay otrosdetallessondependientesde la
implementaci´on,porloque esmas usual usar m´ascaras y
enterospararealizardichastareas
#define KEYWORD01
#define EXTRENAL02 #define
STATIC04 intflags;
flags|=KEYWORD|EXTERN;if
(flags& STATIC) {...
214. Sistemas Operativos El Lenguaje de programaci´on C 213 / 265
Estructuras
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
215. Sistemas Operativos 214
El Lenguaje de programacio´n C
typedef
I C proporcionauna herramientaparaponerle nombresatipos:
typedef
I Su usoes similarauna declaraci´onde variable precedidade la
palabratypedef.Loque ir´ıa enel lugar del nombre de la
variable esel nombre del tipo
typedef int*punteroEntero;typedef struct
NUEVA nueva_t;
216. Sistemas Operativos El Lenguaje de programaci´on C 215 / 265
Si ahora quisi´eramosdeclararunavariable punteroaenteroy
otra de tipo struct NUEVA podr´ıamos hacer punteroEnterop;
nueva_tn;
Estructuras
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
218. Sistemas Operativos El Lenguaje de programaci´on C 217 / 265
Ejercicios
I Implementare Cun programaque lee enterosde suentrada
est´andary losimprime enordeninverso,utilizandounapila.
Implementarlapila
I Con un array
I Con un array de punteros
I De manera din´amica
I ImplementarunalistaenCdonde cada elementode lalista
contiene unapalabray unentero.El programa lee suentrada
220. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n
C 219 / 265
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
BibliotecaC
Documentaci´on enl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
221. Sistemas Operativos El Lenguaje de programaci´on
C 220 / 265
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Biblioteca C
I El lenguaje Cesmuypequen˜o,sinembargo,muchasde lastareas
podemoshacerlaspormediode labibliotecaC.por ejemplo,
usamosfuncionesde labibliotecaCpara
I asignar y desasignar memoria
I manipulado decadenas y caracteres
222. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n
C 221 / 265
I funciones matem´aticas I
entrada salida I ...
I En lossistemastipoUNIXla informaci´onsobre lasfuncionesde
la bibliotecaCest´adisponible enladocumentaci´onenl´ınea
(secci´on3 de las p´aginasde manual).Porejemplo,para
obtenerinformaci´onsobre printf
$ man 3 printf
o enotros sistemas
$ man -s3 printf
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
223. Sistemas Operativos El Lenguaje de programaci´on
C 222 / 265
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Documentaci´on en l´ınea
I La informaci´onenl´ıneade unafunci´onnosindica,adem´asde
la sintaxisde dichafunci´on,si esnecesarioalgu´nfichero include
o hay que indicarle algunalibrer´ıaadicional I Porejemplo,si
miramoslap´agina de manual de la funci´onsqrt,vemosque es
224. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n
C 223 / 265
necesarioincluirel fichero<math.h>yque adem´ashay que
enlazarcon -lm
SQRT(3) Linux Programmer’s Manual
NAME sqrt, sqrtf, sqrtl -square rootfunction
SYNOPSIS
#include <math.h>
double sqrt(doublex); float sqrtf(float x);
long doublesqrtl(long doublex);
Link with -lm.
.....
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
225. Sistemas Operativos El Lenguaje de programaci´on
C 224 / 265
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Asignacio´n de memoria
I Para asignar memoria tenemos void
*malloc(size_tsize);
226. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n
C 225 / 265
I Le pasamos comoargumentola cantidadde bytes que queremos
reservar(t´ıpicamente usamos sizeof para determinarlo)
I Nos devuelve una direcci´onde memoria, comounpuntero
gen´erico (void*), donde haydisponible dicha cantidad de bytes
(no m´as). Si no queremos que el compiladorde un avisoal
asignarloa, porejemplo, unpunteroa entero, debemos haceruna
conversi´onde tipo
I Cuando ya no necesitemos la memoria asignada con malloc
podemos desasignarlacon void free(void *ptr);
I Utilizar m´as memoria de la asignadao hacer free sobre una
direcci´on queno ha sido obtenida con malloc produce resultados
indefinidos,t´ıpicamenteun error en tiempo de ejecuci´on
I Otras funciones relacionadas:calloc,realloc
BibliotecaC
Documentaci´onenl´ınea
227. Sistemas Operativos El Lenguaje de programaci´on
C 226 / 265
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
228. Sistemas Operativos El Lenguaje de programacio´n C 227 / 265
Funciones de caracteres
I La biblioteca C proporciona una serie de funciones que
permiten tratar con caracteres. Sus prototipos est´an
declaradose <ctype.h>int isalnum(int c);intisalpha(int
c); int isascii(intc);intisblank(intc);intiscntrl(intc);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(intc);intisxdigit(intc);
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
230. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C 229 / 265
I Cuandose almacenauna cadenade caracteresdebe estar
terminadaporel car´acter cuyoc´odigoes 0 (’0’) ya que eslo
que esperanencontrar lasfuncionesde cadenas
I Las funcionesde cadenasesperanunadirecci´onde memoria
(char *); como el nombre de unarray es la direcci´ondonde se
almacenael array, lasfuncionesde cadenaspuedenrecibir
tanto unarray comoun puntero
I Hay algunasdiferenciassutilesentre el arrayyel punteroa
car´acter
El Lenguaje de programaci´on C
231. Sistemas Operativos 230 / 265
I Consideremoslasiguiente declaraci´on
char a[MAX]="estoesunacadena";
I Se declara unarray de MAX caracteresy se inicializaa
‘‘estoesunacadena’’
I El siguiente c´odigoproduce unerrorde compilaci´on
a="la cadenaha cambiadode valor";
puestoque el nombre del arrayesla direcci´ondonde
comienzael array,y ´esta nopuede cambiarse
I Podr´ıamoscambiar el valordel array con una de las funciones
de cadena
strcpy(a,"lacadenahacambiadode valor");
232. Sistemas Operativos 231 / 265
El Lenguaje de programaci´on C
I Consideremoslasiguiente declaraci´on
char *a="esto esuna cadena";
I Se declara unpunteroy se inicializaaladirecci´onde memoria
donde est´ala constante literal ‘‘estoesunacadena’’ I El siguiente
c´odigoNO produce errorde compilaci´onni entiempode
ejecuci´on
a="la cadenaha cambiadode valor";
se asignaal punterola direcci´onde memoriadonde est´ala
constante literal ‘‘la cadena ha cambiado de valor’’ I Si
intentamos cambiar el valor de puntero con una de las
funcionesde cadena
strcpy(a,"lacadenahacambiadode valor");
233. Sistemas Operativos 232 / 265
el resultadoesindefinidopuestoque estamosintentando
sobreescribirlacadena‘‘estoesunacadena’’que est´a donde
el compiladorhapuestolasconstantesliteralesconotra
cadena,que adem´asesde mayorlongitud
El Lenguaje de programacio´n C
I Consideremoslasiguiente declaraci´on
char *a;
a=(char *) malloc(MAX*sizeof (char));asignaal punteroa
una direcci´on de memoria donde hay espaciopara MAX
caracteres
I La sentencias strcpy(a,"esto es una cadena"); strcpy(a,"la
cadena ha cambiado de valor"); son perfectamente
234. Sistemas Operativos 233 / 265
correctas siempre ycuandoMAX seamayor que lalongitud
de ‘‘lacadena ha cambiadode valor’’+1
I Sinembargola asignaci´ona="lacadenaha
cambiadode valor";
hace que el valor del punteroseaahora el de la direcci´onde la
constante literal ‘‘la cadena ha cambiado de valor’’ , y hemos
perdidolamemoriaasignadacon malloc
El Lenguaje de programaci´on C
I Cuandohacemosuna asignaci´onesunaasignaci´onentre
punteros.
I Se asignan direcciones dememoria
I No se copian cadenas
235. Sistemas Operativos 234 / 265
I Si queremoscopiarcadenasdebemosusarlafunci´onde librer´ıa
strcpy
I Es responsabilidad del programador que en el sitio a donde se
copia haya espacio suficientepara la cadena que sequiere
copiar
I El espacio necesario es la longitud de la cadena + 1 byte adicional
(para el caracter ’0’ que marca el fin de cadena. I Se muestranposibles
implementacionesde lasfuncionesde lalibrer´ıa strcpy (que copia
una cadena) y strdup (que crea unduplicado)
El Lenguaje de programaci´on C
236. Sistemas Operativos El Lenguaje de programacio´n
C 235 / 265
voidstrcpy(char*s, char *t)
{ inti=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);returnp;
}
237. Sistemas Operativos El Lenguaje de programacio´n C236
/ 265
I Funcionesde caracteres:resumen(string.h)
I char *strcpy(char *dest, constchar *orig);
I char *strncpy(char *dest, constchar *orig, size_t n);
I void *memcpy(void *dest, constvoid *src,size_t n);
I size_t strlen(constchar *s);
I char *strcat(char *dest, const char *src);
I char *strncat(char *dest, const char *src,size_t n);
I int strcmp(constchar *s1,const char *s2);
238. Sistemas Operativos El Lenguaje de programacio´n
C 237 / 265
I int strncmp(constchar *s1,const char *s2, size_t n);
I strstr,strchr,...
I Otras funciones(stdlib.h):atoi,atof,atol,...
Biblioteca C
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
239. Sistemas Operativos El Lenguaje de programacio´n C238
/ 265
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Entrada/salida con formato
I El prototipode estasfuncionesest´aen<stdio.h>
I Si queremoshacerlaentradasalidaporcaracterestenemosint
getchar() intputchar(intc)
240. Sistemas Operativos El Lenguaje de programacio´n
C 239 / 265
I Para cadenas de caracteres
char * gets(char *s) int
puts(constchar *s)
I La funci´onde entradasalidaconformatoes printf(...]
I El formatode printf esintprintf(constchar
*format,...)
241. Sistemas Operativos 240 / 265
formates unacadena de caracterescompuestapor I
caracteresque son copiadosa lasalidaest´andar
I especificacionesde conversi´on:comienzanconle caracter% y
terminanconun caracter de conversi´on.
I La primera especificaci´on deconversi´on serefiere al primer
argumento despu´es del format, la segunda al siguiente....
I El significado delos caracteres en una especificaci´on de
conversi´on es:
I - El ajuste es a la izquierda
I N.M N ancho m´ınimo(para float d´ıgitos antesdel . decimal).
M nu´merom´ınimo de d´ıgitos que se imprimir´an para un entero
(para float nu´merode d´ıgitos a la derecha del . decimal)
I h para enterocorto l para entero largo
I Caracterde conversi´on
242. Sistemas Operativos El Lenguaje de programaci´on C 241 / 265
I El caracter de conversi´onespecificaqu´e hayque imprimir
Especificaciones de conversi´on (%u, %d,...) C´odigos de escape
car´acter argumento salida C´odigo salida
d,i entero entero consigno n nueva l´ınea
u entero entero sin signo t tabulador
o entero entero enoctalsin signo b backspace
x, X entero entero enhexadecimal sinsigno r retorno carro
f real real con puntoy signo ¨ comillas
e,E real notaci´onexponencial con signo ´ ap´ostrofo
g, G
c car´acter car´acter ? ?
s cad. Chars cadena de caracteres
% imprime un%
p void dependeimplementaci´on
ld, lu, lx, lo entero entero largo
243. Sistemas Operativos 242 / 265
I Por ejemplo: printf (‘‘real: %2.4f; entero: %Xn", x,n);
imprimir´ıaalgocomo:
real:3.1516; entero:FF09465
El Lenguaje de programaci´on C
I Si queremoshacerentradaconformato, utilizamos scanf
intscanf(constchar *format,...);
I La especificaci´onde losformatosde scanf escomolade printf.
I Hay que tenerencuentaque en la listade argumentosa scanf no
se le suministranlas variablesque queremosleer,sinolas
direccionesde memoriade lasvariablesque queremosleer
(para que seapor referencia)
I Ejemplo
244. Sistemas Operativos El Lenguaje de programaci´on C 243 / 265
intn; char caracter; scanf ("%d",&n);printf ("nEl cuadradode
%d es: %d",n,n*n);scanf ("%c",&caracter);printf ("nHe
le´ıdoel car´acter: %c",caracter);
245. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa
memoria
Entrada/salidasinformato
Ejercicios
246. Sistemas Operativos El Lenguaje de programaci´on C 245 / 265
Entrada/salida con formato a
fichero
I Las funciones printf,scanf,
puts,gets,putchar,
getcharoperansobre la
entradaest´andary la
salidaest´andar.Existen
funcionestotalmente
an´alogasque operan
sobre ficheros
247. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
I Los ficherospodemosabrirlos
con fopen ycerrarloscon fclose
FILE *fopen(constchar
*path, constchar *mode);
intfclose(FILE*fp);
I Las funcionesparaentraday
salidaa ficheroson
intfprintf(FILE*stream,
const char *format,...);int
fscanf(FILE*stream,const
char *format, ...);char
248. Sistemas Operativos El Lenguaje de programaci´on C 247 / 265
*gets(char*s); int
fputs(constchar*s, FILE
*stream);intfgetc(FILE
*stream);intfputc(intc,
FILE *stream);
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
249. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
Entrada/salidaconformatoa
memoria
Entrada/salidasinformato
Ejercicios
Entrada/salida con formato a
memoria
I Existentambi´en
funcionesque nos
permitensimplemente
250. Sistemas Operativos El Lenguaje de programaci´on C 249 / 265
hacer laentrada/salida
sobre variablesen
memoria.
I Estas funcionesoperan
exactamente igual que las
que hemosvisto, pero
requierenunargumento
adicional
I Una variabletipo puntero
a car´acter,donde se va
a colocar la salida
formateada
251. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
adecuadamente (o
desde donde se
pretende leer la
entrada)
intsprintf(char*str,const
char *format, ...);int
sscanf(constchar*str, const
252. Sistemas Operativos El Lenguaje de programaci´on C 251 / 265
char *format, ...);Biblioteca
C
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa
memoria
253. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
Entrada/salidasinformato
Ejercicios
Entrada/salida sin formato
I Quiz´ala maneramas
c´omoda de realizare/s
seala de las llamadasal
sistemaenUNIX;estas
llamadassimplemente
leenbytesyescriben
bytesenun fichero
254. Sistemas Operativos El Lenguaje de programaci´on C 253 / 265
I Si queremosque tenganun
formatoespec´ıfico,
podemosformatear
previamentelosdatos
I Para abrir un ficheroint
open(constchar*pathname,
intflags,mode_tmode);
pathname nombre del
fichero flags modo
de apertura O
RDONLY, O
255. Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
WRONLY, O
RDWR, O CREAT O
EXCL...
mode permisos del fichero (solo
si secrea el fichero)
I Devuelve unentero
(descriptordel fichero)
que se usa en read y
write
256. Sistemas Operativos 255 / 265
I Para leer o escribir ssize_t read(int fd, void *buf, size_t count); ssize_t
write(intfd,constvoid*buf,size_tcount);
fd descriptor de fichero (obtenido con open
buf direcci´on dememoria para la transferenciadedatos
count nu´mero de bytes de e/s
I Devuelvenennu´merode bytesque se hantransferido
I para cerrar el ficheroint
close(intfd);
I Otras funcionesrelacionadas(trasabrirficheroconfopen())
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);
longftell(FILE *stream);
257. Sistemas Operativos 256 / 265
El Lenguaje de programaci´on C
Biblioteca C
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
258. Sistemas Operativos 257 / 265
Ejercicios
El Lenguaje de programacio´n C
Ejercicios
I RealizarenC un programaque recibacomo par´ametroel nombre de
un ficheroygenere tresficheros
I Uno que contiene los mismos caracteres pero en orden inverso
259. Sistemas Operativos 258 / 265
I Otro que contiene las mismas palabraspero en orden inverso
I Otro que contiene las mismas l´ıneas pero en orden inverso I Se supone
que laseparaci´onentre l´ıneasestadadaporunaocurrenciadel caracter
fin de l´ınea (’n’), y la separaci´on entre palabras por una o m´as
ocurrenciasdel caracterespacio
(’’) o del caracter tab (’t’)
I Puede usarse strtok
El Lenguaje de programaci´on C
260. Sistemas Operativos El Lenguaje de programaci´on
C 259 / 265
Introducci´on
Tipos, operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Herramientas
262. Sistemas Operativos El Lenguaje de programaci´on
C 261 / 265
Depuracio´n de memoria con Valgrind
I Valgrindesunaherramientaque permitedetectarfallosen lagesti´on
de memoria
I Uso de memoria sin asignar
I Accesos incorrectos a memoria
I Memoria asignada, no liberada y perdida (memory leaks)
I Para usar el depuradora
Compilamos con -g -O0
$ gcc -g -O0 ejercicio1.c
263. Sistemas Operativos El Lenguaje de programacio´n C262 /
265
b Invocamos valgrind pas´andoleel ejecutable(y sus par´ametros)
como par´ametro
$ valgrind --leak-check=full --show-reachable=yes a.out
Ejemplo de depuracio´n de memoria con Valgrind (I)
#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!!!
264. Sistemas Operativos El Lenguaje de programaci´on
C 263 / 265
}
Ejemplo de depuracio´n de memoria con Valgrind (II)
$ valgrind --leak-check=full --show-reachable=yes a.out
==27888== Memcheck, a memory error detector
==27888== Copyright (C) 2002-2010, and GNU GPL’d, by Julian Seward et al.
==27888== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==27888== Command: ./a.out ==27888==
==27888== Invalid write of size 4
==27888== at 0x8048448: main (p.c:11)
==27888== Address 0x41b8050 is 0 bytes after a block of size 40 alloc’d
==27888== at 0x4025018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==27888== by 0x8048428: main (p.c:8)
==27888==
0 2 4 6 8 10 12 14 16 18 ==27888==
==27888== HEAP SUMMARY:
==27888== in use at exit: 40 bytes in 1 blocks
==27888== total heap usage: 1 allocs, 0 frees, 40 bytes allocated ==27888==
==27888== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==27888== at 0x4025018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==27888== by 0x8048428: main (p.c:8)
265. Sistemas Operativos El Lenguaje de programacio´n C264 /
265
==27888==
==27888== LEAK SUMMARY:
==27888== definitely lost: 40 bytes in 1 blocks
==27888== indirectly lost: 0 bytes in 0 blocks ==27888== possibly lost: 0 bytes in
0 blocks ==27888== still reachable: 0 bytes in 0 blocks ==27888== suppressed: 0 bytes in
0 blocks
==27888==
==27888== For counts of detected and suppressed errors, rerun with: -v
==27888== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 11 from 6)
Ejemplo de depuracio´n de memoria con Valgrind (III)
Tras corregir errores
$ valgrind --leak-check=full--show-reachable=yes ./a.out
==12056==Memcheck, a memory error detector
==12056==Copyright (C)2002-2010, and GNU GPL’d, by Julian Sewardet al.
==12056==Using Valgrind-3.6.1and LibVEX;rerun with -h for copyrightinfo
==12056==Command: ./a.out
==12056==
266. Sistemas Operativos El Lenguaje de programaci´on
C 265 / 265
0 2 4 6 8 10 12 1416 18 ==12056==
==12056==HEAP SUMMARY:
==12056== in use at exit: 0 bytes in 0 blocks
==12056==totalheap usage: 1allocs, 1 frees,40 bytes allocated
==12056==
==12056==All heap blocks werefreed --no leaks arepossible
==12056==
==12056==For counts ofdetected and suppressederrors, rerunwith: -v
==12056==ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11from 6)