El Lenguaje de programaci´on C
Sistemas Operativos
Universidade da Corun˜a
Sistemas Operativos El Lenguaje de programaci´on C 1 / 218
El Lenguaje de programaci´on C I
Introducci´on
Caracter´ısticas del lenguaje C
Estructura de un programa C
Primeros ejemplos Compilaci
´on de un programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Tipos, operadores y expresiones
Nombres de variables
Tipos y taman˜os de datos
Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l´ogicos
Sistemas Operativos El Lenguaje de programaci´on C 2 / 218
El Lenguaje de programaci´on C II
Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y expresiones
Expresi´on condicional
Precedencia y orden e evaluaci´on
Ejercicios
Control de flujo
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
goto y etiquetas
Ejercicios
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 3 / 218
El Lenguaje de programaci´on C III
funciones
funciones que no devuelven enteros
Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador C
Ejercicios
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a funciones
Operaciones sobre punteros
Arrays y punteros
Arrays de
punteros
Arrays
Sistemas Operativos El Lenguaje de programaci´on C 4 / 218
El Lenguaje de programaci´on C IV
Punteros y arrays multidimensionales
Argumentos en la l´ınea de comando
Punteros a funciones
Ejercicios
Estructuras
Estructuras
Operaciones sobre estructuras
Punteros a estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de bits
typedef
Ejercicios
Biblioteca C
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 5 / 218
El Lenguaje de programaci´on C V
Documentaci´on en l´ınea
Asignaci´on de memoria
Funciones de caracteres
Cadenas de caracteres
Entrada/salida con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a memoria
Entrada/salida sin formato
Ejercicios
Herramientas
Valgrind
Sistemas Operativos El Lenguaje de programaci´on C 6 / 218
Introducci´on
Tipos, operadores y
expresiones Control de flujo
Funciones y estructura de un
programa Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 7 / 218
Introducci´on
Caracter´ısticas del lenguaje
C Estructura de un
programa C Primeros
ejemplos Compilaci´on de un
programa Directivas del
precompilador Depuraci´on
make
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 8 / 218
Caracter´ısticas del lenguaje C
► Es el lenguaje de programaci´on de prop´osito general asociado
al sistema operativo UNIX
► Es un lenguaje de medio nivel. Trata con objetos b´asicos
como car´acteres, nu´meros . . . ; tambi´en con bits y direcciones
de memoria
► Posee una gran portabilidad
► Se utiliza para la programaci´on de sistemas: construcci´on de
interpretes, compiladores, editores de texto, etc
Sistemas Operativos El Lenguaje de programaci´on C 9 / 218
► El lenguaje C consta de
► El lenguaje C propiamente dicho: tipos de datos, expresiones y
estructuras de control
► Extensiones en forma de macros y un amplio conjunto de
librer´ıas predefinidas
Sistemas Operativos El Lenguaje de programaci´on C 10 / 218
Introducci´on
Caracter´ısticas del lenguaje
C Estructura de un
programa C Primeros
ejemplos Compilaci´on de un
programa Directivas del
precompilador Depuraci´on
make
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 11 / 218
Estructura de un programa
C
► Un programa e C consta de uno o m´as m´odulos (ficheros
fuentes)
► Cada m´odulo puede contener
► directivas del precompilador, p.e para “incluir” otros ficheros
(#include) y “definir” constantes y macros (#define)
► declaraciones de variables y prototipos de funciones
► una o m´as funciones
► comentarios
► Cada funci´on puede contener
► directivas del precompilador
► declaraciones
► uno o m´as bloques
► comentarios
Sistemas Operativos El Lenguaje de programaci´on C 12 / 218
► Cada bloque puede contener
► directivas del precompilador
► declaraciones
► una o m´as sentencias
► comentarios
Sistemas Operativos El Lenguaje de programaci´on C 13 / 218
► Cada sentencia debe estar terminada por ;
► Cada bloque de sentencias se encierra entre llaves {. . . }
► La funci´on denominada main es la que primero se ejecuta
► Los comentarios pueden aparecer en cualquier lugar del c´odigo
y se insertan entre /* y */ as´ı
/* esto es un comentario*/
► o entre // y final de l´ınea
// esto es otro comentario
Sistemas Operativos El Lenguaje de programaci´on C 14 / 218
Introducci´on
Caracter´ısticas del lenguaje
C Estructura de un
programa C Primeros
ejemplos Compilaci´on de un
programa Directivas del
precompilador Depuraci´on
make
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 15 / 218
Primeros ejemplos
#include
<stdio.h> main()
{
printf("hola, primer programa en C\
n");
}
Sistemas Operativos El Lenguaje de programaci´on C 16 / 218
#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("%d\t%d\n",fahr,celsius);
fahr=fahr+step;
}
}
Sistemas Operativos El Lenguaje de programaci´on C 17 / 218
Introducci´on
Caracter´ısticas del lenguaje
C Estructura de un
programa C Primeros
ejemplos Compilaci´on de un
programa Directivas del
precompilador Depuraci´on
make
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 18 / 218
Compilacio´n de un programa
► Normalmente invocamos al compilador con cc o gcc
(el compilador de gnu)
► Cuando tecleamos cc programa.c para generar un ejecutable
a partir de un fichero fuente obtenemos un ejecutable, t
´ıpicamente denominado a.out. Sin embargo se realizan tres
tareas
► Paso por el preprocesador C. Es el que procesa las l´ıneas que
comienzan con # (pe #include, #define. . . ). Puede
invocarse directamente con cpp
► La compilaci´on propiamente dicha. Genera ficheros objeto (.o)
a partir de los ficheros fuente. Puede invocarse como cc -c
► El enlazado. Realizado por ld
Sistemas Operativos El Lenguaje de programaci´on C 19 / 218
Introducci´on
Caracter´ısticas del lenguaje
C Estructura de un
programa C Primeros
ejemplos Compilaci´on de un
programa Directivas del
precompilador Depuraci´on
make
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 20 / 218
Directivas del
precompilador
#include Incluye el fichero, cuyo nombre se indica, para su compilaci´on
con el resto del c´odigo
► Si el nombre del fichero va entre < . . . > se busca en el
directorio include del sistema (/ usr/ in cl ud e) . Por ejemplo
#include <stdio .h>
hace que el fichero / u s r / i n c l u d e / s t d i o . 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)
Sistemas Operativos El Lenguaje de programaci´on C 21 / 218
#define Define un s´ımbolo, es decir cada ocurrencia de ese s´ımbolo es
sustituida por su definici´on. Por ejemplo
► El C distingue entre mayu´sculas y minu´sculas, aunque la
costumbre es utilizar mayu´sculas para los s´ımbolos definidos
por el preprocesador
► ejemplo
#define MAX 1024
hace que todas las ocurrencias de la cadena M A X dentro del
c´odigo son sustituidas por 1024
► El c´odigo que se compila lleva 1024 donde iba MA X
► Si M AX iba dentro de comillas ’ ’ . . . ‘‘ , no se sustituye
Sistemas Operativos El Lenguaje de programaci´on C 22 / 218
#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("%d\t%d\n",fahr,celsius);
fahr=fahr+STEP;
}
}
Sistemas Operativos El Lenguaje de programaci´on C 23 / 218
Introducci´on
Caracter´ısticas del lenguaje
C Estructura de un
programa C Primeros
ejemplos Compilaci´on de un
programa Directivas del
precompilador Depuraci´on
make
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 24 / 218
Depuracio´n
► Para depurar programas disponemos del depurador, que nos
permite ejecutar los programas en un entorno controlado
► Para usar el depurador
a. Compilamos con cc -g
$gcc -g ejercicio1.c
b. Invocamos el depurador pas´andole el 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 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 dispone de ayuda en l´ınea,
Sistemas Operativos El Lenguaje de programaci´on C 25 / 218
Introducci´on
Caracter´ısticas del lenguaje
C Estructura de un
programa C Primeros
ejemplos Compilaci´on de un
programa Directivas del
precompilador Depuraci´on
make
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 26 / 218
mak
e
► Facilita el proceso de generaci´on y actualizaci´on de un
programa.
► Determina autom´aticamente qu´e partes de un programa
deben recompilarse ante una actualizaci´on de algunos m´odulos
y las recompila.
► Se crean un archivo Makefile con las dependencias entre los
ficheros: un fichero debe actualizarse si alguna de sus
dependencias es m´as reciente
► El Makefile define tambi´en los mandatos necesarios para
actualizar cada archivo en base a sus dependencias
Sistemas Operativos El Lenguaje de programaci´on C 27 / 218
► El Makefile esta formado por una serie de reglas. Donde
cada regla tiene el siguiente formato
objetivo: dependencia1 dependencia2 . . .
mandato1
mandato2
mandato3
...
► N´otese que
antes de cada
mandato hay un
caracter tab
► Para compilar
usamos la orden
‘‘make
objetivo’’
que
► Encuentra la
regla
Sistemas Operativos El Lenguaje de programaci´on C 28 / 218
Ejemplo muy sencillo de
make► 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);
Sistemas Operativos El Lenguaje de programaci´on C 29 / 218
Ejemplo muy sencillo de
make► 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
)
Sistemas Operativos El Lenguaje de programaci´on C 30 / 218
Ejemplo muy sencillo de
make
► si queremos compilarlo, y generar un 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´ıamos programa.c de la siguiente manera
gcc -o programa.out programa.c funcion2.o
funcion1.o
► Cada vez que se modificase uno de los archivos habr´ıa que
repetir alguna (o todas) de las anteriores compilaciones
Sistemas Operativos El Lenguaje de programaci´on C 31 / 218
Ejemplo muy sencillo de
make
► El siguiente archivo Makefile se ocupa de decidir que hay
que compilar y hacerlo
programa.out: programa.c func ion1.h func ion2.h funci on1.o funci on2.o
gcc - o programa.out programa.c func ion2.o funcio n1.o
f u n c i o n 1 . o : func ion1.h fu nc i o n1 . c
gcc - c func ion1.o fu n c io n 1. c
f u n c i o n 2 . o : func ion2.h fu nc i o n2 . c
gcc - c func ion2.o fu n c io n 2. c
limpiar:
rm programa.out func ion1.o fun cion2 .o
Sistemas Operativos El Lenguaje de programaci´on C 32 / 218
Otro ejemplo de
make
CC=gcc
CFLAGS=-g
OBJS2=pra
c2.o
aux1.o
all: prac1 prac2
prac1: prac1.o
aux1.o
gcc -g -o
prac1 prac1.o
aux1.o
prac2: $(OBJS2)
${CC} $
Sistemas Operativos El Lenguaje de programaci´on C 33 / 218
Introducci´on
Caracter´ısticas del lenguaje
C Estructura de un
programa C Primeros
ejemplos Compilaci´on de un
programa Directivas del
precompilador Depuraci´on
make
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 34 / 218
Ejercicios
► Compilar los programas de ejemplo de esta secci´on
► Observar las salida del preprocesador de cada uno de ellos
► Usar el depurador para ejecutar paso a paso los dos u´ltimos y
ver como cambian de valor las variables en el bucle
► Crear un Makefile para un archivo y compilarlo con make
Sistemas Operativos El Lenguaje de programaci´on C 35 / 218
Introducci´on
Tipos, operadores y
expresiones Control de flujo
Funciones y estructura de un
programa Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 36 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 37 / 218
Nombres de
variables
► los nombres de variables pueden tener letras, nu´meros y el
s´ımbolo ’ ’.
► Deben empezar por una letra (pueden empezar por ’ ’ pero no
es recomendable pues es el criterio que usan las rutinas de la
biblioteca)
► Pueden llevar mayu´sculas y minu´sculas. El C distingue entre
mayu´sculas y minu´sculas
► La costumbre es que las variables van en minu´scula y las
constantes en mayu´scula
► Las palabras reservadas if, else . . . no pueden usarse como
nombres de variables
Sistemas Operativos El Lenguaje de programaci´on C 38 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 39 / 218
Tipos y taman˜os de datos
► El C tiene pocos tipos de 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
float Un real
double Un real en doble precisi´on
► Adem´as int puede ser short o long y tanto int como char
pueden ser signed o unsigned
► unsigned long int, unsinged long,
► El taman˜o depende del compilador pero int no es menor
que
short ni mayor que long
► Existe tambi´en el long long int con mayor rango y el long
double con precisi´on extendida para los reales
Sistemas Operativos El Lenguaje de programaci´on C 40 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 41 / 218
Constantes
► Una constante entera es int (ejemplo 12714)
► Si queremos que sea long le ponemos el sufijo ’l’ o ’L’.
(ejemplo 12714L)
► Una constante con un punto decimal o un exponente
es un
double (ejemplos 3.141516, 1e-5)
► Si queremos que sea float le ponemos el sufijo ’f’ o ’F’
(ejemplos 3.141516f, 1e-5F)
► Si una constante entera comienza por 0 se entiende que est´a
en octal y si comienza por 0x o 0X en hexadecimal
► Ejemplos 034892 (octal) 0xffff4000 (hexadecimal)
Sistemas Operativos El Lenguaje de programaci´on C 42 / 218
► Una constante car´acter se pone entre comillas simples
(ejemplo ’a’). Puede aparecer en operaciones y su valor es el
c´odigo de dicho caracter
► Una constante car´acter tambi´en se puede expresar por su c
´odigo en octal o hexadecimal. Ejemplos: ’\077’ (octal) o ’\
x3f’ (hexadecimal)
► Algunas constantes especiales: ’\t’ (tab) ’\n’ (fin de l´ınea’)
’\r’ retorno de carro . . .
► Una constante cadena se encierra entre comillas dobles
(”. . . “). Las cadenas en C est´an terminadas por el caracter
’\0’,
Sistemas Operativos El Lenguaje de programaci´on C 43 / 218
► Una expresi´on constante es una expresi´on que solo incluye
constantes. Puede ser evaluada en tiempo de compilaci´on y
ser utilizada en lugar de una constante
#define MAXIMO 1024
char linea[MAXIMO/2 +20];
► Un caso particular de constantes son los tipos enumerados.
Un tipo enumerado es una lista de valores enteros constantes
enum boolean {FALSE, TRUE};
► Salvo que se especifique otra cosa, comienzan en 0, as´ı FALSE
ser´ıa 0 y TRUE 1
► Tambi´en puede especificarse el valor de comienzo
enum dias {LUNES=1, MARTES, MIERCOLES,
JUEVES, VIERNES, SABADO,
DOMINGO};
Sistemas Operativos El Lenguaje de programaci´on C 44 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 45 / 218
Declaraciones de
variables
► Todas las variables deben ser declaradas antes de su uso.
► Las declaraciones deben aparecer al principio de cada funci´on
o bloque de sentencias
► La declaraci´on consta de un tipo de variable y una lista de
variables separadas por coma
int i,j;
float
x,pi;
unsigned
long
longitud,
contador;
► Las variables
pueden
inicializarse
en la declaraci
Sistemas Operativos El Lenguaje de programaci´on C 46 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 47 / 218
Operadores aritm
´eticos
+ suma
- resta
* multiplicaci´on
/ divisi´on. Si los operandos son enteros la divisi´on es entera
% resto entero. No admite operandos float o double
Sistemas Operativos El Lenguaje de programaci´on C 48 / 218
#include
<stdio.h> #define
UPPER 300
#define LOWER 0
#define STEP
20 main()
{
float fahr,
celsius;
fahr=LOWER;
while(fahr<=UPPER)
{
celsius=5.0/9.0*(fahr-32)
printf("%f\t%f\n",fahr,celsius);
fahr=fahr+STEP;
}
}
Sistemas Operativos El Lenguaje de programaci´on C 49 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 50 / 218
Operadores de relaci´on y lo´gicos
► Operadores de relaci´on
< menor que
<= menor o igual que
> mayor que
>= mayor o igual que
= = igual a
! = distinto
Sistemas Operativos El Lenguaje de programaci´on C 51 / 218
► Operadores l´ogicos
&& AND
|| OR
! NOT
► Los operadores l´ogicos se evalu´an de izquierda a derecha, y se
detiene la evaluaci´on tan pronto como se conoce el
resultado.
Por ejemplo
i<MAXIMO && (linea[i]=getchar())!=’\n’ &&
linea[i]!=EOF
Comprobar´ıa primero que i es menor que MAXIMO; si lo es
asigna el valor que devuelve getchar() a linea[i] y comprueba
que es distinto de fin de l´ınea. y en ese caso comprueba que
linea[i] no es EOF
Sistemas Operativos El Lenguaje de programaci´on C 52 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 53 / 218
Conversiones de tipo
► Cuando en una operaci´on aparecen tipos distintos, el C
convierte el tipo de menor rango al tipo de mayor antes de
realizar la operaci´on
► Podemos forzar la conversi´on de tipos poniendo antes de la
variable el tipo al que queremos convertir.
► Por ejemplo, la funci´on sin espera un argumento de tipo
double. Podemos pasarle una 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);
Sistemas Operativos El Lenguaje de programaci´on C 54 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 55 / 218
Operadores de
bit
► Podemos operar sobre los bits de una variable entera (las
variables char son un tipo de enteros). Todos son operadores
binarios, excepto el complemento a 1
& AND bit a bit
| OR bit a bit
ˆ XOR bit a bit
<< Desplazamiento de bits a la izquierda
>> Desplazamiento de bits a la derecha
˜ Complemento a 1
Sistemas Operativos El Lenguaje de programaci´on C 56 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 57 / 218
Incremento y decremento, asignaci´on y expresiones
► Los operadores incremento ( + + ) y decremento (−−) pueden
usarse 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’;
asigna a linea[i] el valor ’a’ y luego incrementa el valor de i,
mientras que
linea[--i]=’z’
primero decrementa el valor de i y luego le asigna a linea[i] el
valor ’z’
► Cuando se modifica el valor de una variable a partir de un
valor anterior, puede escribirse de forma m´as compacta
► xOPERADOR =expresi´on; equivale a x=x OPERADOR
(expresi´on);
Sistemas Operativos El Lenguaje de programaci´on C 58 / 218
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;
...
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)*/
Sistemas Operativos El Lenguaje de programaci´on C 59 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 60 / 218
Expresi´on
condicional
► Es de la forma expre1?expre2 : expre3
► Se evalu´an expre1, si es cierta (distinta de 0) el resultado es lo
que valga expre2
► Si es 0, el resultado es lo que valga expre3
► Ejemplos
char * a;
a= (p==NULL)? "cadena1": gets(p);
int n;
n= i*j*k ? 2567: (int) sqrt (pi);
printf ("Resultado: %s\n" (p!=NULL)? p:" error");
Sistemas Operativos El Lenguaje de programaci´on C 61 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 62 / 218
Precedencia y orden e evaluaci
´on
► El C no especifica en que orden se evalu´an los operandos de
una expresi´on. Por ejemplo, en la expresi´on x = f () + g ()
no sabemos si se evaluar´a primero f() o g()
► El C tampoco especifica en que orden se evalu´an los
par´ametros a una funci´on,
printf (‘‘%d %d’’,++i,i)
produce un resultado indeterminado
► Las operaciones l´ogicas se evalu´an de izquierda a derecha y se
detiene la evaluaci´on tan pronto como se conozca el resultado
► El C s´ı define una precedencia entre distintos operadores,
Adem´as cada operador tiene una asociatividad, como puede
verse en la tabla siguiente
Sistemas Operativos El Lenguaje de programaci´on C 63 / 218
OPERADORES asociatividad
() [] -> . izquierda a derecha
! ~ ++ -- - * & (tipo) derecha a izquierda
sizeof
* / izquierda a derecha
+ - izquierda a derecha
<< >> izquierda a derecha
< <= > >= izquierda a derecha
== != izquierda a derecha
& izquierda a derecha
^ izquierda a derecha
| izquierda a derecha
&& izquierda a derecha
|| izquierda a derecha
?: derecha a izquierda
= += -= *= /= %= &= |= derecha a izquierda
etc
, izquierda a derecha
Sistemas Operativos El Lenguaje de programaci´on C 64 / 218
Tipos, operadores y
expresiones
Nombres de variables
Tipos y taman˜os de
datos Constantes
Declaraciones de variables
Operadores aritm´eticos
Operadores de relaci´on y l
´ogicos Conversiones de tipo
Operadores de bit
Incremento y decremento, asignaci´on y
expresiones Expresi´on condicional
Precedencia y orden e evaluaci
´on Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 65 / 218
Ejercicios
► Escribir un programa en C que nos imprima los taman˜os de
todos los tipos de datos
► Escribir una funci´on InvierteBitsC que invierte los bits de un
caracter sin signo
► Escribir una funci´on InvierteBitsS que invierte los bits de un
entero corto sin signo.
► Escribir una funci´on InvierteBitsL que invierte los bits de un
entero largo sin signo
► Hacer un programa que imprima los enteros del 0 al 100 y el
resultado de invertir los bits
► Considerando los nu´meros del 0 al 100 como caracteres sin
signo
► Considerando los nu´meros del 0 al 100 como enteros cortos sin
signo
► Considerando los nu´meros del 0 al 100 como enteros largos
sin
signo
Sistemas Operativos El Lenguaje de programaci´on C 66 / 218
Introducci´on
Tipos, operadores y
expresiones Control de flujo
Funciones y estructura de un
programa Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 67 / 218
Control de flujo
Sentencias y bloques
if
else
else-if
switch
bucleswhile, for y
do..while break y
continue
goto y etiquetas
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 68 / 218
► Una expresi´on seguida en un ; es una sentencia
► Toda sentencia debe ir terminada con ;
► Pueden ir varias sentencias en una misma l´ınea
► Las llaves { } se emplean para agrupar sentencias. en lo que
se denomina bloque
► Un bloque es sint´acticamente equivalente a una sentencia
► Dentro de un bloque puede haber sentencias y declaraciones
Sistemas Operativos El Lenguaje de programaci´on C 69 / 218
Control de flujo
Sentencias y bloques
if
else
else-if
switch
bucleswhile, for y
do..while break y
continue
goto y etiquetas
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 70 / 218
if
else
if (expresi´on)
sentencia1
else
sentencia2
► Se evalu´a expresi´on. Si es distinta de 0 (cierta) se ejecuta
sentencia1, si es 0 se ejecuta sentencia2
► El else es opcional
► Tanto sentencia1 como sentencia2 pueden ser un bloque se
sentencias entre llaves { }
► Expresi´on no termina con ;
Sistemas Operativos El Lenguaje de programaci´on C 71 / 218
► Dado que el else es opcional, una sentencia else siempre va
con el if inmediatamente anterior
► El siguiente c´odigo es incorrecto
if (n>0)
if
(a>b)
printf ("a es mayor que b\
n"); else
printf ("n es menor que 0\
n");
► La versi´on correcta ser´ıa
if (n>0)
{ if
(a>b)
printf
("a es
mayor
que
Sistemas Operativos El Lenguaje de programaci´on C 72 / 218
Control de flujo
Sentencias y bloques
if
else
else-if
switch
bucleswhile, for y
do..while break y
continue
goto y etiquetas
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 73 / 218
else-if
if (expresi´on1)
sentencia1
else if(expresi´on2)
sentencia2
else if(expresi´on3)
sentencia3
...
else
sentencian
► Permite
tomar
decisiones mu
´ltiples
► Se evalu´an en
orden
Sistemas Operativos El Lenguaje de programaci´on C 74 / 218
Control de flujo
Sentencias y bloques
if
else
else-if
switch
bucleswhile, for y
do..while break y
continue
goto y etiquetas
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 75 / 218
switch
switch (expresi´on) {
case constante1: sentencias
case constante2: sentencias
case constante3: sentencias
...
default: sentencias
}
► Permite tomar una decisi´on mu´ltiple basada en una expresi´on
que puede tomar un nu´mero de valores constantes enteros (los
char son un tipo de entero)
► El valor de expresi´on se va comparando con las constantes por
orden y una vez que coincide con una de ellas se ejecutan
todas las sentencias (incluidas las de los cases siguientes) hasta
que se encuentra la sentencia break
► Esto permite agrupar varios valores constantes que compartan
una misma acci´on
► Si no queremos que pase de un case al siguiente, debemos
terminarlo con break
Sistemas Operativos El Lenguaje de programaci´on C 76 / 218
#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 = %d\n", nwhite, nother);
return 0;
Sistemas Operativos El Lenguaje de programaci´on C 77 / 218
Control de flujo
Sentencias y bloques
if
else
else-if
switch
bucleswhile, for y
do..while break y
continue
goto y etiquetas
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 78 / 218
bucleswhile, for y
do..while
while (expresi´on)
sentencia
► Se evalu´a
expresi´on, y
si es distinta
de 0 se
ejecuta
sentencia
► sentencia
debe estar
terminada
por ;
► sentencia
Sistemas Operativos El Lenguaje de programaci´on C 79 / 218
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
for (expr1; expr2; expr3)
sentencia
► Equivale exactamente a
expr1;
while (expr2){
sentencia
expr3;
}
► La expresiones del for, a diferencia de otros lenguajes, no
tienen por que ser referidas a enteros, pueden ser expresiones
de cualquier tipo
Sistemas Operativos El Lenguaje de programaci´on C 81 / 218
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
do
sentencia
while (expresi´on)
► Se ejecuta sentencia y despu´es se evalu´a expresi´on, con lo que
sentencia se ejecuta al menos una vez
► sentencia debe estar terminada por ;
► sentencia puede ser un bloque se sentencias entre llaves { }
Sistemas Operativos El Lenguaje de programaci´on C 83 / 218
Control de flujo
Sentencias y bloques
if
else
else-if
switch
bucleswhile, for y
do..while break y
continue
goto y etiquetas
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 84 / 218
break y
continue
► C proporciona dos modos de salida de los bucles: break y
continue
break Provoca la salida del bucle. Si hay varios bucles anidados
provoca la salida de aquel donde se encuentra
continue Provoca la salida de la presente iteraci´on del bucle. Se vuelve a
la condici´on.
► break se utiliza tambi´en para la salida del switch
int i;
for (i=1;i<10;i++)
{ if (i)
continue;
//break;
printf("\n i vale
%d",i);
}
Sistemas Operativos El Lenguaje de programaci´on C 85 / 218
Control de flujo
Sentencias y bloques
if
else
else-if
switch
bucleswhile, for y
do..while break y
continue
goto y etiquetas
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 86 / 218
goto y
etiquetas
► Aunque no son formalmente necesarias, ni convenientes, C
dispone de una sentencia goto y etiquetas
► Una etiqueta tiene el mismo formato que un nombre de
variable, seguida de dos puntos
► Debe estar en la misma funci´on en donde se encuentra
el goto
for ( ... )
for ( ... ) {
for ( ... ) {
...
if
(disaster)
goto
error;
}
...
Sistemas Operativos El Lenguaje de programaci´on C 87 / 218
Control de flujo
Sentencias y bloques
if
else
else-if
switch
bucleswhile, for y
do..while break y
continue
goto y etiquetas
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 88 / 218
Ejercicios
► Escribir una funci´on en C ConvierteAEnt, que a partir de una
cadena de caracteres que contiene la representaci´on de un
entero en una base, y dicha base nos devuelve el entero
► Escribir una funci´on en C ConvierteACad, que a partir de un
entero y una base nos devuelve una representaci´on de entero
en dicha base
► Comprobar que son correctas
► Podemos suponer que la longitud m´axima de la cadena es 16
► hacer un programa en C que a imprima todos los enteros del
32 al 64 en todas las bases de 2 a 16. Imprime un entero (en
las 16 bases) por l´ınea
Sistemas Operativos El Lenguaje de programaci´on C 89 / 218
Introducci´on
Tipos, operadores y
expresiones Control de flujo
Funciones y estructura de un
programa Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 90 / 218
Funciones y estructura de un programa
funciones
funciones que no devuelven
enteros Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador
C Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 91 / 218
funciones
► Un programa e C es una colecci´on de funciones.
► Una de esas funciones se llama main y es la primera en
ejecutarse
► Las funciones pueden residir en uno o varios ficheros
fuente
► Cada funci´on tiene la forma
tipo de dato nombre funcion (declaraciones
argumentos)
{
declaraciones y sentencias
}
► Se puede omitir el tipo de dato que devuelve la funci´on (en
ese caso se asume que es int
Sistemas Operativos El Lenguaje de programaci´on C 92 / 218
► Una funci´on puede no tener argumentos o no tener
declaraciones o sentencias
funcion_simple()
{
}
► Cuando una funci´on no lleva par´ametros o no devuelve ningu´n
valor se usa el t´ermino void
void funcion_nada(void)
Sistemas Operativos El Lenguaje de programaci´on C 93 / 218
#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)
Sistemas Operativos El Lenguaje de programaci´on C 94 / 218
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
Sistemas Operativos El Lenguaje de programaci´on C 95 / 218
}
/* 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
► Las funciones devuelven valores mediante la sentencia return
► El formato es
return expresi´on;
o
return (expresi
´on);
► expresi´on se
convierte al tipo
de dato que
devuelve la funci
´on
► Puede aparecer en cualquier parte de una funci´on y provoca la
inmediata salida de ella
► Si dicha sentencia aparece dentro de un bucle provoca la salida
de la funci´on y por tanto del bucle
Sistemas Operativos El Lenguaje de programaci´on C 97 / 218
Funciones y estructura de un programa
funciones
funciones que no devuelven
enteros Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador
C Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 98 / 218
funciones que no devuelven enteros
► C asume que toda funci´on, salvo que se especifique en
contrario, devuelve un entero
► Si tenemos una funci´on que devuelve un valor que no es un
entero, y sobre todo, si la definici´on de dicha funci´on aparece
en el c´odigo despu´es de la primera vez que es llamada,
debemos declararla
► Esto se hace declarando el tipo que devuelve la funci´on.
► Podemos declarar tambi´en los par´ametros que recibe, as´ı el
compilador podr´a comprobar la sintaxis cuando es llamada
► En el ejemplo siguiente podemos ver que se declaran los
valores devueltos por las funciones llamadas desde main
Sistemas Operativos El Lenguaje de programaci´on C 99 / 218
#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%g\n", sum +=
atof(line));
Sistemas Operativos El Lenguaje de programaci´on C 100 / 218
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;
}
Sistemas Operativos El Lenguaje de programaci´on C 101 / 218
Funciones y estructura de un programa
funciones
funciones que no devuelven
enteros Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador
C Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 102 / 218
Variables externas
► Variables externas son las que est´an definidas fuera del cuerpo
de cualquier funci´on
► Son compartidas por todos las funciones en mismo fichero
fuente desde donde est´a definida la variable hasta el final del
fichero
► En C, las variables definidas dentro de bloques se llaman
autom´aticas, se crean autom´aticamente cuando comienza la
ejecuci´on del bloque y se desasignan al terminar dicha ejecuci
´on
Sistemas Operativos El Lenguaje de programaci´on C 103 / 218
► El dominio (zona donde se reconoce el nombre) de las
variables autom´aticas se reduce al bloque donde est´an
declaradas
► El dominio de los argumentos a una funci´on es dicha
funci´on
► Si en un bloque interior se declara una variable con el mismo
nombre que una en un bloque mas exterior (o una externa)
dentro de dicho bloque el nombre se refiere a la declarada en
´el
► Si queremos que una variable externa sea compartida por
varios ficheros fuente distintos, debe definirse en uno de ellos
y en los otros declararla con el identificador extern
Sistemas Operativos El Lenguaje de programaci´on C 104 / 218
Funciones y estructura de un programa
funciones
funciones que no devuelven
enteros Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador
C Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 105 / 218
Variables est´aticas
► Una variable est´atica es una variable local de una funci´on que
no se crea y destruye al llamar a la funci´on
► Se declaran anteponiendo la palabra static a la declaraci´on
void funcioncilla (void)
{
static int veces=0;
++veces
printf ("Esta funcion ha sido llamada %d\n"
veces);
}
► Desde el punto de vista del almacenamiento, una variable est
´atica es en realidad una variable externa, y el termino static la
hace privada a la funci´on
► Si una variable externa (o una funci´on) la declaramos static la
hacemos privada para el fichero fuente donde est´a definida
Sistemas Operativos El Lenguaje de programaci´on C 106 / 218
Funciones y estructura de un programa
funciones
funciones que no devuelven
enteros Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador
C Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 107 / 218
Variables registro
► 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 en un registro de la m´aquina
register int indice;
► El compilador tiene libertad de colocarla en un registro o no
► Solo es aplicable a variables autom´aticas y par´ametros de las
funciones
► No puede preguntarse por la direcci´on de una variable
registro, aunque de hecho no se almacene en un registro
Sistemas Operativos El Lenguaje de programaci´on C 108 / 218
Funciones y estructura de un programa
funciones
funciones que no devuelven
enteros Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador
C Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 109 / 218
Inicializaci´on
► C permite que las variables sean inicializadas en la declaraci´on
► Las variables externas y est´aticas se inicializan una sola vez
durante la compilaci´on
► Las inicializaciones de variables autom´aticas son sentencias de
asignaci´on (se ejecutan)
► Las expresiones de inicializaci´on deben ser conocidas en el
momento de la inicializaci´on: Las variables externas y est
´aticas solo pueden inicializarse a valores constantes
► Los arrays tambi´en pueden inicializarse mediante una lista de
sus elementos entre llaves y separados por ,
int dias_por_mes[] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 }
► En este caso no es necesario declarar la dimensi´on del array
Sistemas Operativos El Lenguaje de programaci´on C 110 / 218
Funciones y estructura de un programa
funciones
funciones que no devuelven
enteros Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador
C Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 111 / 218
Recursividad
► C permite recursividad en las funciones, tanto directa como
indirecta
► No es necesaria 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’);
Sistemas Operativos El Lenguaje de programaci´on C 112 / 218
Funciones y estructura de un programa
funciones
funciones que no devuelven
enteros Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador
C Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 113 / 218
EL preprocesador C
► Adem´as de la directiva #include y el uso elemental
del
#define, el preprocesador C tiene otras funcionalidades
► Uso de #define para definir macros
#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 podemos saber si un s´ımbolo ha sido
definido o no. Ejemplo: prevenir que un fichero include se
incluya varias veces, (lo que dar´ıa s´ımbolos duplicados)
#ifndef
_UNISTD_H
#define
_UNISTD_H
.....
Sistemas Operativos El Lenguaje de programaci´on C 114 / 218
► Puede dejarse sin efecto una definici´on
#undef MAXIMO
► Puede comprobarse si se han definido s´ımbolos con algu´n
valor concreto, para hacer construcciones m´as complejas
#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
Funciones y estructura de un programa
funciones
funciones que no devuelven
enteros Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesador
C Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 116 / 218
Ejercicios
► Repartir los programas de ejemplo de este tema en varios
ficheros fuente (uno para cada funci´on), de manera que se
puedan compilar separadamente. Hacer los ficheros include
correspondientes
► Declarar una variable externa con el mismo nombre en cada
fichero fuente y comprobar si es o no la misma
► Declarar todas las variables locales como register y
compilarlo
► Hacer que la variable externa declarada en el apartado
anterior sea la misma para todos los ficheros
► Hacer en C una funci´on recursiva que calcula en factorial de
un nu´mero. Imprimir los 20 primeros factoriales
Sistemas Operativos El Lenguaje de programaci´on C 117 / 218
Introducci´on
Tipos, operadores y
expresiones Control de flujo
Funciones y estructura de un
programa Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 118 / 218
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 119 / 218
► Un puntero es una variable que contiene la direcci´on de un
dato. C proporciona dos operadores relacionados con las
direcciones de memoria
* Operador indirecci´on. A partir de una variable tipo puntero
nos proporciona el dato apuntado
& Operador direcci´on. A partir de una variable nos da la
direcci´on de memoria donde se almacena dicha variable
► Para declarar un puntero se declara el tipo de dato
apuntado
int *p;
double
*pf;
declara que *p es un entero, por tanto p es un puntero a
entero
*pf es un double, por tanto pf es un puntero a un
double
Sistemas Operativos El Lenguaje de programaci´on C 120 / 218
► Organizaci´on de Memoria: Ejemplo
Sistemas Operativos El Lenguaje de programaci´on C 121 / 218
► La declaraci´on del puntero reserva memoria para la variable
puntero NO PARA EL OBJETO APUNTADO. En el
ejemplo anterior se reserva memoria para p, El acceso a *p
tiene un resultado indefinido, pudiendo resultar en un error en
tiempo de ejecuci´on
► Antes de usar un puntero debemos asegurarnos que apunta un
una direcci´on correcta
► Asign´andole la direcci´on de una variable. Por ejemplo
p=&i;
► Asign´andole el valor que devuelva una funci´on que reserve
memoria para ´el. Por ejemplo
p=(int *) malloc (sizeof (int));
► Tras utilizar el puntero, siempre se debe liberar la memoria
reservada con malloc utilizando la funci´on free
free(p);
Sistemas Operativos El Lenguaje de programaci´on C 122 / 218
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 123 / 218
Punteros y argumentos a
funciones
► en C todas las llamadas a funci´on son por valor: La funci´on
recibe siempre una copia de lo que se le pasa como
argumento. Las modificaciones se realizan sobre la copia
► Las siguiente funci´on no afecta a los argumentos que se le
pasan
void intercambia (int x, int y) /* INCORRECTA
*/
{
int temp;
temp =
x; x =
y;
y =
temp;
}
Una llamada a intercambia
Sistemas Operativos (a,b) Cno intercambiar´ıa los
El Lenguaje de programaci´on 124 / 218
► Si queremos que la funci´on sea llamada por referencia, lo que
hacemos es que la funci´on reciba las direcciones de las
variables que queremos modificar, y a trav´es de ellas acceda a
las variables
void intercambia(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
► Para intercambiar dos variables a y b la llamar´ıamos
intercambia(&a,&b);
Sistemas Operativos El Lenguaje de programaci´on C 125 / 218
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 126 / 218
Operaciones sobre
punteros
► C permite 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´ıa al siguiente entero
► puntero - entero
► puntero = puntero Asignaci´on entre punteros
► puntero = NULL
► puntero = = NULL Comparaci´on con NULL
► puntero ! = NULL
► puntero ==puntero La comparaci´on entre punteros tiene
restricciones
Sistemas Operativos El Lenguaje de programaci´on C 127 / 218
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 128 / 218
Arrays y punteros
► La declaraci´on en C de un array es
tipo nombre array[dimension]
► La siguiente declaraci´on declara un array de 10 enteros
int a [10];
► Los elementos se acceden como a[0], a[1] . . . a[9]
► Los elementos de un array se almacenan consecutivamente en
memoria
► El nombre del array es la direcci´on del primer elemento del
array
Sistemas Operativos El Lenguaje de programaci´on C 129 / 218
,
► Consideremos ahora lo siguiente
int *pa;
pa=&a[0];
► los elementos del array a[0], a[1]...a[9] est´an
almacenados en las direcciones de memoria
pa,pa+1,...pa+9 por lo que pueden ser accedidos como
*pa, *(pa+1),. . . *(pa+9)
► Dado que el nombre del array es la direcci´on del primer
elemento del array, podr´ıamos haber hecho pa=a en lugar de
pa=&a[0];
Sistemas Operativos El Lenguaje de programaci´on C 130 / 218
,
► C tambi´en admite el acceso a los elementos del array de esta
manera
pa[0], pa[1] pa[9]
► Hay que tener en cuenta que, aunque el nombre del array es la
direcci´on del primer elemento del array, no es una variable,
sino una constante, por lo que una sentencia del tipo
a=pb;
producir´a un error en tiempo de compilaci´on
Sistemas Operativos El Lenguaje de programaci´on C 131 / 218
,
► Si queremos pasar un subarray a una funci´on podemos hacerlo
de manera muy sencilla. Con las declaraciones anteriores
f(a+3);
f(&a[3]);
pasar´ıan un subarray comenzando en el tercer elemento del
array.
► La declaraci´on de los par´ametros en la funci´on que recibe el
array puede ser (suponiendo que no devuelve nada)
void f (int ar[]) { ....}
o
void f (int *ar) { ....}
Sistemas Operativos El Lenguaje de programaci´on C 132 / 218
#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("%d\n", p[0]);
p++;
printf("%d\n", p[0]);
q = &(a[0]);
printf("%d == %d \n", q[0][0], (*q)[0]); // equivalentes
q++;
printf("%d\n", 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);
}
Sistemas Operativos El Lenguaje de programaci´on C 133 / 218
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 134 / 218
Arrays de
punteros
► En C un puntero es como cualquier otra variable (en concreto
es un tipo de entero)
► Pueden hacerse arrays de punteros.
► La declaraci´on
int * ar[MAX]
declara que ar es un array de MAX punteros a enteros. Los
elementos ar[i] son punteros. El acceso a *ar[i], mientras
no inicialicemos adecuadamente los ar[i] produce un
resultado indefinido
► De la misma manera que en el apartado anterior exist´ıa una
relaci´on muy estrecha entre el puntero y el array, aqu´ı el
puntero equivalente al array ar se declarar´ıa
int **par;
Sistemas Operativos El Lenguaje de programaci´on C 135 / 218
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 136 / 218
Arrays multidimensionales
► C proporciona arrays multidimensionales, aunque se usan m´as
los arrays de punteros.
► La declaraci´on de un array de dos dimensiones es
tipo nombre array[dim1][dim2]
int matriz [FILAS][COLUMNAS];
► El acceso al elemento i,j es matriz[i][j]
Sistemas Operativos El Lenguaje de programaci´on C 137 / 218
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
/* 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
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 140 / 218
Punteros y arrays
multidimensionales
► Aunque en C existen los arrays multidimensionales, no suelen
usarse pues es mas conveniente usar los arrays de punteros.
La declaraci´on
int a[10][20];
declara un array de 10x20 enteros (10 filas y 20 columnas).
► a es la direcci´on de un bloque donde hay 200 enteros. Para
acceder al elemento a[1][3] tengo que saber que cada fila tiene
20 columnas
► Si quiero pasar dicho array a una funci´on tendr´ıa que pasarle la
segunda dimensi´on ara que pudiese acceder correctamente a los
enteros
int func (int arr[][20])
► Consideremos ahora esta otra declaraci´on
int * p[10];
declara un array de 10 punteros a entero
Sistemas Operativos El Lenguaje de programaci´on C 141 / 218
► 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].
► En memoria tengo 10 bloques de 20 enteros cada uno (no
necesariamente consecutivos) (mas 10 punteros)
► El acceso es m´as r´apido pues no necesito multiplicaciones
para
determinar a donde accedo (solo sumas e indirecciones)
► A una funci´on no tendr´ıa que pasarle la segunda dimensi´on
para que pudiese acceder a los enteros
► Es mas flexible, pues no todos los bloques tienen que ser del
mismo taman˜o. Esto es especialmente interesante cuando
queremos cadenas de caracteres
Sistemas Operativos El Lenguaje de programaci´on C 142 / 218
► En las siguientes figuras vemos la diferencia en la disposici´on
de memoria
► Array de punteros
► Array multidimensional
Sistemas Operativos El Lenguaje de programaci´on C 143 / 218
► Con esta otra declaraci´on
int **p;
creamos un array multidimensional basado en punteros.
► Si queremos crear una matriz de 4 filas por 6 columnas,
debemos reservar memoria para filas 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
► Acceso a elementos de la matriz
for (i = 0; i < 4; i++)
{
for (j = 0; j < 6; j++)
{
p[i][j] = 0; //
*(p[i] + j) = 0; Equivalentes
*(*(p + i) + j) = 0;
}
}
► Para liberar la matriz
for (i = 0; i < 4; i+
+) free(p[i]);
free(p);
Sistemas Operativos El Lenguaje de programaci´on C 145 / 218
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 146 / 218
Argumentos en la l´ınea de comando
► C proporciona un m´etodo para acceder a los argumentos de la l
´ınea de comando, a trav´es de los par´ametros de main
1 Declaramos que main tiene dos par´ametros; uno un entero y
otro un array de punteros a car´acter, de la siguiente manera
int main(int argv, char argv[])
2 Al ejecutar el programa, argc tendr´a el nu´mero de argumentos
y los argv[i] (hasta argv[argc-1]) son los argumentos de l´ınea
de comando
► argv[0] es el nombre del programa que se ejecuta por lo que si
argc es 1, no se le han pasado argumentos
Sistemas Operativos El Lenguaje de programaci´on C 147 / 218
#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
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 149 / 218
Punteros a funciones
► Aunque una funci´on no es una variable, si podemos usar
punteros a funciones, de manera que podemos usarlos en
arrays o pasarlos como par´ametros a otras funciones
► La siguiente declaraci´on
double (*pfunc)(int,double)
declara que pfunc es un puntero a una funci´on que devuelve
un double y que recibe dos par´ametros; un int y un double
char * (*pfunc)(char **)
ahora pfunc es un puntero a una funci´on funci´on que devuelve
un puntero a caracter y que recibe como argumento un array
de punteros a car´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 a la funci´on que compara una l´ınea con otra
Sistemas Operativos El Lenguaje de programaci´on C 150 / 218
/* 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
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
► Si quisi´esemos utilizar la siguiente funci´on para comparar
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
retur
n 0;
}
teniendo en cuenta que el nombre de la funci´on es un
puntero a la funci´on, la llamada ser´ıa
Qsort (lineas,MAXLINEAS,
Sistemas Operativos
numcmp);
El Lenguaje de programaci´on C 153 / 218
Arrays y punteros
Punteros y direcciones
Punteros y argumentos a
funciones Operaciones sobre
punteros
Arrays y punteros
Arrays de
punteros
Arrays
multidimensionale
s
Punteros y arrays
multidimensionales Argumentos en
la l´ınea de comando Punteros a
funciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 154 / 218
Ejercicios
► Escribir un programa en C que imprime todas las l´ıneas de su
entrada est´andar que contienen una palabra que se le pasa
como argumento
► Escribir un programa en C que admite como par´ametro un nu
´mero entero N; si el nu´mero es positivo imprime las N
primeras l´ıneas de su entrada, y si es negativo las (-)N u´ltimas.
► Escribir un programa en C que ordene todas las l´ıneas que lee
de su entrada usando la funci´on qsort. Si recibe el par´ametro
-n las ordena por longitud, en caso contrario lo hace
alfab´eticamente
Sistemas Operativos El Lenguaje de programaci´on C 155 / 218
Introducci´on
Tipos, operadores y
expresiones Control de flujo
Funciones y estructura de un
programa Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 156 / 218
Estructuras
Estructuras
Operaciones sobre
estructuras Punteros a
estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de
bits typedef
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 157 / 218
Estructuras
► Una estructura es una colecci´on de una o mas variables, no
necesariamente del mismo tipo, agrupadas bajo un solo
nombre
► Es el equivalente al registro (record) del pascal
►La declaraci´on es de la forma
struct nombre estructura {lista variables} nombre variable ;
► El nombre de la estructura puede omitirse. Las siguientes
declaraciones son (casi) equivalentes: todas declaran dos
estructuras (p1 y p2) cada una de las cuales contiene 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
c struct {
int
x;
int
y;
} p1 ,
p2;
► En las modalidades a) y b) la estructura tiene un nombre
(struct COORDENADAS) que nos podr´ıa servir para declarar
m´as estructuras del mismo tipo (o par´ametros a una funci´on)
en otra parte del programa
► 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 COORDENADAS p1={ 5,9 };
Sistemas Operativos El Lenguaje de programaci´on C 159 / 218
Estructuras
Estructuras
Operaciones sobre
estructuras Punteros a
estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de
bits typedef
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 160 / 218
Operaciones sobre
estructuras
► C permite las siguientes operaciones sobre estructuras
► copia o asignaci´on
► acceso a sus miembros
► obtener su direcci´on con &
► Pasarlas como argumentos a funciones
► Ser devueltas por funciones
► Las estructuras no se pueden comparar
► Para acceder a los miembros de una estructura usamos el
operador .
Con las declaraciones del apartado anterior
p1.x=3
p1.y=9
;
p2.x=p2
.y=0
► Una estructura puede tener miembros que sean a su vez
estructuras
Sistemas Operativos El Lenguaje de programaci´on C 161 / 218
Estructuras
Estructuras
Operaciones sobre
estructuras Punteros a
estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de
bits typedef
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 162 / 218
Punteros a estructuras
► C tambi´en permite punteros a estructuras.
► La declaraci´on de un puntero a una estructura es como la de
un puntero a cualquier otra variable. Se declara el objeto
apuntado.
►Tambi´en son v´alidas las distintas modalidades vistas
a struct COORDENADAS {
int
x;
int
y;
} *p1,
*p2;
b struct COORDENADAS {
int x;
int y;
};
Sistemas Operativos El Lenguaje de programaci´on C 163 / 218
c struct
{
int
}x;*p1 , *p2;
int acceder a los miembros de una estructura a trav´es
► Podemos
y;
del puntero de dos maneras
► Accediendo a la estructura
(*p1).x
Los par´entesis () son necesarios pues el operador . tiene
precedencia sobre la indirecci´on *
► Directamente desde el puntero mediante el operador ->
p1->x
En general este sistema es el preferido, sobre todo cuando
usamos variables tipo struct para crear estructuras de datos
(listas, pilas, ´arboles . . . )
p->siguiente->siguiente->siguiente
(*(*(*p).siguiente).siguiente).siguiente
Sistemas Operativos El Lenguaje de programaci´on C 164 / 218
► Al igual que con los otros punteros, la declaraci´on de un
puntero a una estructura reserva espacio para el puntero pero
NO PARA LA ESTRUCTURA APUNTADA POR E´L por
lo que el acceso a dicha estructura produce un resultado
indefinido (incluso un error en tiempo de ejecuci´on)
► Antes de acceder a la estructura apuntada debemos inicializar
el puntero
► Asign´andole la direcci´on de una variable
► Reserv´andole memoria con alguna funci´on (p.e. malloc)
► En el siguiente ejemplo reservamos memoria para MAX
estructuras struct COORD y lo asignamos a un puntero. El
operador sizeof nos devuelve el taman˜o de la estructura
► El taman˜o de una estructura no es necesariamente la suma del
taman˜o de sus miembros
struct CORD *p;
p=(struct CORD *) malloc (MAX * sizeof (struct
CORD));
Sistemas Operativos El Lenguaje de programaci´on C 165 / 218
Estructuras
Estructuras
Operaciones sobre
estructuras Punteros a
estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de
bits typedef
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 166 / 218
Arrays de estructuras
► C permite tambi´en hacer arrays de estructuras, la sintaxis es
la misma que para 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
cada elemento 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 usa un array
de estructuras para contar el nu´mero de palabras reservadas
de C que se utilizan en un fichero
Sistemas Operativos El Lenguaje de programaci´on C 167 / 218
#include <stdio.h>
#include
<ctype.h>
#include
<string.h>
#define MAXWORD
100 struct key {
char
*word;
int count;
} keytab[] = {
"auto", 0,
"break", 0,
"case", 0,
"char", 0,
"const", 0,
"continue"
, 0,
"default",
0,
/* ... */
"unsigned"
, 0,
"void", 0,
"volatile"
, Operativos
Sistemas 0, El Lenguaje de programaci´on C 168 / 218
/* 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 %s\n",
keytab[n].count,
keytab[n].word);
Sistemas Operativos El Lenguaje de programaci´on C 169 / 218
/* 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;
}
Sistemas Operativos El Lenguaje de programaci´on C 170 / 218
Estructuras
Estructuras
Operaciones sobre
estructuras Punteros a
estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de
bits typedef
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 171 / 218
Estructuras autoreferenciadas
► Una estructura no puede referenciarse a si misma es decir,
tener una estructura del mismo tipo como miembro, puesto
que esto dar´ıa lugar a una recursi´on infinita.
► Lo que si puede tener como miembro es uno o varios punteros
a una estructura de su mismo tipo
► Esto nos permite realizar estructuras de datos en memoria
struct
TNODO{ struct
INFO info;
struct TNODO *izq;
struct TNODO
*der;
};
Sistemas Operativos El Lenguaje de programaci´on C 172 / 218
Estructuras
Estructuras
Operaciones sobre
estructuras Punteros a
estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de
bits typedef
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 173 / 218
Uniones
► Una uni´on es una variable que contiene tipos de datos
distintos en instantes distintos
► Permite manipular distintos tipos de datos en la misma zona
de memoria
► Se declara de manera similar a una estructura pero con la
palabra union
► El acceso a los miembros de la union es con el operador . (o
con el operador -> si accedemos a trav´es de un puntero)
union VARIOS {
int entero;
char
bytes[4];
float real;
} u;
► Una union puede contener arrays y/o estructuras. Una
estructura tambi´en puede contener uniones. Est´an permitidos
tambi´en los arrays de
Sistemas Operativos
uniones.
El Lenguaje de programaci´on C 174 / 218
Estructuras
Estructuras
Operaciones sobre
estructuras Punteros a
estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de
bits typedef
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 175 / 218
Campos de bits
► Permiten, con una variable de tipo struct tener acceso directo
a los bits de un entero
► Con una declaraci´on de este tipo
struct {
unsigned int is_keyword :
1; unsigned int is_extern :
1; unsigned int is_static :
1;
} flags;
podemos acceder a los bits
individualmente como
flags.is_keyword=1;
flags.is_extern=0;
..
if
(flags.is_static)
Sistemas Operativos El Lenguaje de programaci´on C 176 / 218
► Si los bits comienzan a asignarse por la izquierda o por la
derecha y otros detalles son dependientes de la
implementaci´on, por lo que es mas usual usar m´ascaras y
enteros para realizar dichas tareas
#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
Estructuras
Estructuras
Operaciones sobre
estructuras Punteros a
estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de
bits typedef
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 178 / 218
typede
f
► C proporciona una herramienta para ponerle nombres a tipos:
typedef
► Su uso es similar a una declaraci´on de variable precedida de la
palabra typedef. Lo que ir´ıa en el lugar del nombre de la
variable es el nombre del tipo
typedef int * punteroEntero;
typedef struct NUEVA
nueva_t;
Si ahora quisi´eramos declarar una variable puntero a entero y
otra de tipo struct NUEVA podr´ıamos hacer
punteroEntero
p; nueva_t n;
Sistemas Operativos El Lenguaje de programaci´on C 179 / 218
Estructuras
Estructuras
Operaciones sobre
estructuras Punteros a
estructuras
Arrays de estructuras
Estructuras autoreferenciadas
Uniones
Campos de
bits typedef
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 180 / 218
Ejercicios
► Implementar e C un programa que lee enteros de su entrada
est´andar y los imprime en orden inverso, utilizando una pila.
Implementar la pila
► Con un array
► Con un array de punteros
► De manera din´amica
► Implementar una lista en C donde cada elemento de la lista
contiene una palabra y un entero. El programa lee su entrada
(cada l´ınea tiene una palabra y un entero) y almacena los
elementos en la lista ordenados por el valor del entero.
Sistemas Operativos El Lenguaje de programaci´on C 181 / 218
Introducci´on
Tipos, operadores y
expresiones Control de flujo
Funciones y estructura de un
programa Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 182 / 218
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 183 / 218
Biblioteca C
► El lenguaje C es muy pequen˜o, sin embargo, muchas de las
tareas podemos hacerlas por medio de la biblioteca C. por
ejemplo, usamos funciones de la biblioteca C para
► asignar y desasignar memoria
► manipulado de cadenas y caracteres
► funciones matem´aticas
► entrada salida
► ...
► En los sistemas tipo UNIX la informaci´on sobre las funciones
de la biblioteca C est´a disponible en la documentaci´on en l
´ınea (secci´on 3 de las p´aginas de manual). Por ejemplo, para
obtener informaci´on sobre printf
$ man 3 printf
o en otros sistemas
$ man -s 3 printf
Sistemas Operativos El Lenguaje de programaci´on C 184 / 218
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 185 / 218
Documentaci´on en l´ınea
► La informaci´on en l´ınea de una funci´on nos indica, adem´as de
la sintaxis de dicha funci´on, si es necesario algu´n fichero
include o hay que indicarle 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
que adem´as hay que enlazar con -lm
SQRT(3) Linux
Programmer’s Manual
NAME
s q r t , s q r t f , s q r t l - sq uare r o o t f u n c t i o n
SYNOPSIS
#incl ude <math.h>
double s q r t ( d o u b l e x ) ;
float sqrtf(float x);
long double s q r t l ( l o n g
double x ) ;
Link with - l m .
. . . . .
Sistemas Operativos El Lenguaje de programaci´on C 186 / 218
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 187 / 218
Asignacio´n de memoria
► Para asignar memoria tenemos
void *malloc(size_t size);
► Le pasamos como argumento la cantidad de bytes que
queremos reservar (t´ıpicamente usamos sizeof para
determinarlo)
► Nos devuelve una direcci´on de memoria, como un puntero gen
´erico (void *), donde hay disponible dicha cantidad de bytes
(no m´as). Si no queremos que el compilador de un aviso al
asignarlo a, por ejemplo, un puntero a entero, debemos hacer
una conversi´on de tipo
► Cuando ya no necesitemos la memoria asignada con malloc
podemos desasignarla con
void free(void *ptr);
► Utilizar m´as memoria de la asignada o hacer free sobre una
direcci´on que no ha sido obtenida con malloc produce
resultados indefinidos, t´ıpicamente un error en tiempo de
ejecuci´on
► Otras funciones relacionadas: calloc, realloc
Sistemas Operativos El Lenguaje de programaci´on C 188 / 218
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 189 / 218
Funciones de
caracteres
► La biblioteca C proporciona una serie de funciones que
permiten tratar con caracteres. Sus prototipos 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);
Sistemas Operativos El Lenguaje de programaci´on C 190 / 218
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 191 / 218
Cadenas de
caracteres
► En C no existen las variable tipo cadenas (strings). Existen
► arrays de caracteres
► punteros a car´acter
► Cuando se almacena una cadena de caracteres debe estar
terminada por el car´acter cuyo c´odigo es 0 (’\0’) ya que es lo
que esperan encontrar las funciones de cadenas
► Las funciones de cadenas esperan una direcci´on de memoria
(char *); como el nombre de un array es la direcci´on donde se
almacena el array, las funciones de cadenas pueden recibir
tanto un array como un puntero
► Hay algunas diferencias sutiles entre el array y el puntero a
car´acter
Sistemas Operativos El Lenguaje de programaci´on C 192 / 218
► Consideremos la siguiente declaraci´on
char a[MAX]="esto es una cadena";
► Se declara un array de MAX caracteres y se inicializa a
‘‘esto es una cadena’’
► El siguiente c´odigo produce un error de compilaci´on
a="la cadena ha cambiado de valor";
puesto que el nombre del array es la direcci´on donde comienza
el array, y ´esta no puede cambiarse
► Podr´ıamos cambiar el valor del array con una de las funciones
de cadena
strcpy(a,"la cadena ha cambiado de valor");
Sistemas Operativos El Lenguaje de programaci´on C 193 / 218
► Consideremos la siguiente declaraci´on
char *a="esto es una cadena";
► Se declara un puntero y se inicializa a la direcci´on de memoria
donde est´a la constante literal ‘‘esto es una cadena’’
► El siguiente c´odigo NO produce error de compilaci´on ni en
tiempo de ejecuci´on
a="la cadena ha cambiado de valor";
se asigna al puntero la direcci´on de memoria donde est´a la
constante literal ‘‘la cadena ha cambiado de valor’’
► Si intentamos cambiar el valor de puntero con una de las
funciones de cadena
strcpy(a,"la cadena ha cambiado de valor");
el resultado es indefinido puesto que estamos intentando
sobreescribir la cadena ‘‘esto es una cadena’’ que est´a
donde el compilador ha puesto las constantes literales con
otra cadena, que adem´as es de mayor longitud
Sistemas Operativos El Lenguaje de programaci´on C 194 / 218
► Consideremos la siguiente declaraci´on
char *a;
a=(char *) malloc (MAX*sizeof (char));
asigna al puntero a una direcci´on de memoria donde hay
espacio para MAX caracteres
► La sentencias
strcpy(a,"esto es una cadena");
strcpy(a,"la cadena ha cambiado de
valor");
son perfectamente correctas siempre y cuando MAX sea
mayor que la longitud de ‘‘la cadena ha cambiado de
valor’’ +1
► Sin embargo la asignaci´on
a="la cadena ha cambiado de valor";
hace que el valor del puntero sea ahora el de la direcci´on de la
constante literal ‘‘la cadena ha cambiado de valor’’ ,
y hemos perdido la memoria asignada con malloc
Sistemas Operativos El Lenguaje de programaci´on C 195 / 218
► Cuando hacemos una asignaci´on es una asignaci´on entre
punteros.
► Se asignan direcciones de memoria
► No se copian cadenas
► Si queremos copiar cadenas debemos usar la funci´on de
librer´ıa strcpy
► Es responsabilidad del programador que en el sitio a donde se
copia haya espacio suficiente para la cadena que se quiere
copiar
► El espacio necesario es la longitud de la cadena + 1 byte
adicional (para el caracter ’\0’ que marca el fin de cadena.
► Se muestran posibles implementaciones de las funciones de la
librer´ıa strcpy (que copia una cadena) y strdup (que crea un
duplicado)
Sistemas Operativos El Lenguaje de programaci´on C 196 / 218
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
Sistemas p;
Operativos El Lenguaje de programaci´on C 197 / 218
► Funciones de caracteres: resumen (string.h)
► char *strcpy(char *dest, const char
*orig);
► char *strncpy(char *dest, const char *orig, size_t
n);
► void *memcpy(void *dest, const void *src, size_t
n);
► size_t strlen(const char
*s);
► char *strcat(char *dest, const char
*src);
► char *strncat(char *dest, const char *src, size_t
n);
► int strcmp(const char *s1, const char
*s2);
► int strncmp(const char *s1, const char *s2, size_t
n);
► strstr, strchr,...
► Otras funciones (stdlib.h): atoi, atof, atol,...
Sistemas Operativos El Lenguaje de programaci´on C 198 / 218
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 199 / 218
Entrada/salida con formato
► El prototipo de estas funciones est´a en <stdio.h>
► Si queremos hacer la entrada salida por caracteres tenemos
int getchar()
int putchar(int c)
► Para cadenas de caracteres
char * gets(char *s)
int puts(const char
*s)
► La funci´on de entrada salida
con formato es printf(. . . ]
► El formato de printf es
int printf(const char
*format, ...)
Sistemas Operativos El Lenguaje de programaci´on C 200 / 218
format es una cadena de caracteres compuesta por
► caracteres que son copiados a la salida est´andar
► especificaciones de conversi´on: comienzan con le caracter % y
terminan con un caracter de conversi´on.
► La primera especificaci´on de conversi´on se refiere al primer
argumento despu´es del format, la segunda al siguiente . . . .
► El significado de los caracteres en una 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´mero de d´ıgitos a la derecha del . decimal)
► h para entero corto l para entero largo
► Caracter de conversi´on
Sistemas Operativos El Lenguaje de programaci´on C 201 / 218
► El caracter de conversi´on especifica qu´e hay que imprimir
Especificaciones de conversi´on (%u, %d,...) Codigos de escape
car´acter argumento salida C´odigo salida
d,i entero entero con signo \n nueva l´ınea
u entero entero sin signo \t tabulador
o entero entero en octal sin signo \b backspace
x, X entero entero en hexadecimal sin signo \r retorno carro
f real real con punto y signo \¨ 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: %X\n",
x,n);
imprimir´ıa algo como:
real: 3.1516; entero:
Sistemas Operativos
FF09465
El Lenguaje de programaci´on C 202 / 218
► Si queremos hacer entrada con formato, utilizamos scanf
int scanf(const char *format, ...);
► La especificaci´on de los formatos de scanf es como la de printf.
► Hay que tener en cuenta que en la lista de argumentos a scanf
no se le suministran las variables que queremos leer, sino las
direcciones de memoria de las variables que queremos leer
(para que sea por 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
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 204 / 218
Entrada/salida con formato a
fichero
► Las funciones printf, scanf, puts, gets, putchar, getchar
operan sobre la entrada est´andar y la salida est´andar. Existen
funciones totalmente an´alogas que operan sobre ficheros
► Los ficheros podemos abrirlos con fopen y cerrarlos con fclose
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *fp);
► Las funciones para entrada y salida a fichero 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);
Sistemas Operativos El Lenguaje de programaci´on C 205 / 218
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 206 / 218
Entrada/salida con formato a
memoria
► Existen tambi´en funciones que nos permiten simplemente
hacer la entrada/salida sobre variables en memoria.
► Estas funciones operan exactamente igual que las que hemos
visto, pero requieren un 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, ...);
Sistemas Operativos El Lenguaje de programaci´on C 207 / 218
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 208 / 218
Entrada/salida sin formato
► Quiz´a la manera mas c´omoda de realizar e/s sea la de las
llamadas al sistema en UNIX; estas llamadas simplemente leen
bytes y escriben bytes en un fichero
► Si queremos que tengan 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 de apertura O RDONLY, O WRONLY, O RDWR, O
CREAT O EXCL. . .
mode permisos del fichero (solo si se crea el fichero)
► Devuelve un entero (descriptor del fichero) que se usa en
read
y write
Sistemas Operativos El Lenguaje de programaci´on C 209 / 218
► Para leer o escribir
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t
count);
fd descriptor de fichero (obtenido con open
buf direcci´on de memoria para la transferencia de datos
count nu´mero de bytes de e/s
► Devuelven en nu´mero de bytes que se han
transferido
► para cerrar el fichero
int close(int fd);
► Otras funciones relacionadas (tras abrir fichero con
fopen())
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
Biblioteca C
Biblioteca C Documentaci
´on en l´ınea Asignaci´on de
memoria Funciones de
caracteres Cadenas de
caracteres Entrada/salida
con formato
Entrada/salida con formato a fichero
Entrada/salida con formato a
memoria Entrada/salida sin formato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 211 / 218
Ejercicios
► Realizar en C un programa que reciba como par´ametro el
nombre de un fichero y genere tres ficheros
► Uno que contiene los mismos caracteres pero en orden
inverso
► Otro que contiene las mismas palabras pero en orden
inverso
► Otro que contiene las mismas l´ıneas pero en orden
inverso
► Se supone que la separaci´on entre l´ıneas esta dada por una
ocurrencia del caracter fin de l´ınea (’\n’), y la separaci´on
entre palabras por una o m´as ocurrencias del caracter espacio
(’ ’) o del caracter tab (’\t’)
► Puede usarse strtok
Sistemas Operativos El Lenguaje de programaci´on C 212 / 218
Introducci´on
Tipos, operadores y
expresiones Control de flujo
Funciones y estructura de un
programa Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 213 / 218
Herramientas
Valgrind
Sistemas Operativos El Lenguaje de programaci´on C 214 / 218
Depuracio´n de memoria con Valgrind
► Valgrind es una herramienta que permite detectar fallos en la
gesti´on de memoria
► Uso de memoria sin asignar
► Accesos incorrectos a memoria
► Memoria asignada, no liberada y perdida (memory leaks)
► Para usar el depurador
a. Compilamos con -g -O0
$ gcc -g -O0 ejercicio1.c
b. Invocamos valgrind pas´andole el ejecutable (y sus par´ametros)
como par´ametro
$ valgrind --leak-check=full --show-reachable=yes a.out
Sistemas Operativos El Lenguaje de programaci´on C 215 / 218
Ejemplo de depuracio´n de memoria con Valgrind (I)
#include <stdio.h>
#include
<malloc.h> main()
{
int i;
int
*v;
v=(int*
)
malloc
(10*siz
eof(int
));
for (i=0;i<=10;i++) // aqu´ı hay un acceso no valido!
v[i]=i*2;
for(i=0;i<10;i++)
Sistemas Operativos printf("%d",v[i]);
El Lenguaje de programaci´on C 216 / 218
Ejemplo de depuracio´n de memoria con Valgrind (II)
$ v a l g r i n d - - l e a k - c h e c k = f u l l - - s ho w- r e a c h a b l e = ye s a . o u t
==27888== Memcheck, a memory e r r o r d e t e c t o r
==27888== C op y r i gh t ( C ) 20 02- 2 010, and GNU GPL’d, by J u l i a n Seward e t a l .
==27888== Usi ng Va l g r i n d - 3 . 6 . 1 and LibVEX; r e r u n wi t h - h f o r c o p y r i g h t i n f o
==27888== Command: . / a . o u t
==27888==
==27888== I n v a l i d w r i t e o f s i z e 4
==27888== a t 0x8048448: main ( p . c : 1 1 )
==27888== Addre ss 0x41b8050 i s 0 b y t e s a f t e r a b l oc k o f s i z e 40 a l l o c ’ d
==27888== a t 0x4025018: m a l l o c ( i n / u s r / l i b / v a l g r i n d / v g p r e l o a d _ m e m c h e c k - x 8 6 - l i n u x . s o )
==27888== by 0x8048428: main ( p . c : 8 )
==27888==
0 2 4 6 8 10 12 14 16 18 ==27888==
==27888== HEAP SUMMARY:
==27888== i n us e a t e x i t : 40 b y t e s i n 1 b l o c k s
==27888== t o t a l heap u s a g e : 1 a l l o c s , 0 f r e e s , 40 b y t e s a l l o c a t e d
==27888==
==27888== 40 b y t e s i n 1 b l o c k s a r e d e f i n i t e l y l o s t i n l o s s r e c o r d 1 o f 1
==27888== a t 0x4025018: m a l l o c ( i n / u s r / l i b / v a l g r i n d / v g p r e l o a d _ m e m c h e c k - x 8 6 - l i n u x . s o )
==27888== by 0x8048428: main ( p . c : 8 )
==27888==
==27888== LEAK SUMMARY:
==27888== d e f i n i t e l y l o s t : 40 b y t e s i n 1 b l o c k s
==27888== i n d i r e c t l y l o s t : 0 bytes i n 0 blocks
==27888== po ssi bly l o s t : 0 bytes i n 0 blocks
==27888== s t i l l re a c h a b l e : 0 bytes i n 0 blocks
==27888== suppressed: 0 bytes i n 0 blocks
==27888==
==27888== For c o u n t s o f d e t e c t e d and s u p p r e s s e d e r r o r s , r e r u n w i t h : - v
==27888== ERROR SUMMARY: 2 e r r o r s from 2 c o n t e x t s ( s u p p r e s s e d : 11 from 6 )
Sistemas Operativos El Lenguaje de programaci´on C 217 / 218
Ejemplo de depuracio´n de memoria con Valgrind (III)
Tras corregir errores
$ v a l g r i n d - - l e a k - c h e c k = f u l l --show-reachable=yes . / a . o u t
==12056== Memcheck, a memory e r r o r d e t e c t o r
==12056== Copyright (C) 2002-2010, and GNU GPL’d, by J u l i a n Seward e t a l .
==12056== Using Va l g ri n d - 3 . 6 . 1 and LibVEX; r e r u n with - h f o r c op y ri g ht i n f o
==12056== Command: . / a . o u t
==12056==
0 2 4 6 8 10 12 14 16 18 ==12056==
==12056== HEAP SUMMARY:
==12056== i n use a t e x i t : 0 b y t e s i n 0 blo cks
==12056== t o t a l heap u sa g e : 1 a l l o c s , 1 f r e e s , 40 b y t e s a l l o c a t e d
==12056==
==12056== A l l heap bl ocks were f r e e d - - no l e a k s a r e p o s s i b l e
==12056==
==12056== For coun ts o f d e t e c t e d and suppressed e r r o r s , r e r u n w i t h : - v
==12056== ERROR SUMMARY: 0 e r r o r s from 0 c o n t e x t s ( s u p p r e s se d : 11 from 6 )
Sistemas Operativos El Lenguaje de programaci´on C 218 / 218