SlideShare una empresa de Scribd logo
1 de 218
Descargar para leer sin conexión
El Lenguaje de programaci´on C
Sistemas Operativos
Universidade da Coru˜na
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 tama˜nos 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 multidimensionales
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, n´umeros . . . ; 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 Cn");
}
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("%dt%dn",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
Compilaci´on 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/include). Por ejemplo
#include <stdio.h>
hace que el fichero /usr/include/stdio.h se incluya en ese
punto para ser compilado con nuestro fichero fuente
El nombre se puede poner entre comillas (“) y el sistema lo
buscar´a en el directorio actual (tambi´en se puede poner una
ruta absoluta)
Los ficheros se suelen denominar .h y contienen declaraciones
de tipos, variables y prototipos de funciones (son ficheros
fuente que pueden verse)
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 may´usculas y min´usculas, aunque la
costumbre es utilizar may´usculas para los s´ımbolos definidos
por el preprocesador
ejemplo
#define MAX 1024
hace que todas las ocurrencias de la cadena MAX dentro del
c´odigo son sustituidas por 1024
El c´odigo que se compila lleva 1024 donde iba MAX
Si MAX iba dentro de comillas ’’...‘‘, no 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("%dt%dn",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
Depuraci´on
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,
mediante help
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
make
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 correspondiente a objetivo
Trata sus dependencias como objetivos y las resuelve
recursivamente
Dentro del Makefile se pueden definir variables (y acceder a
sus valores) como en el shell: VAR=valor para definir la
variable y ${VAR} o $(VAR) para acceder a su valor. $@ se
refiere al nombre del objetivo
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);
y funcion2.h
#define MAX2 2000
void funcion2(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)
{
int j=MAX2;
return;
}
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 funcion1.h funcion2.h funcion1.o funcion2.o
gcc -o programa.out programa.c funcion2.o funcion1.o
funcion1.o: funcion1.h funcion1.c
gcc -c funcion1.o funcion1.c
funcion2.o: funcion2.h funcion2.c
gcc -c funcion2.o funcion2.c
limpiar:
rm programa.out funcion1.o funcion2.o
Sistemas Operativos El Lenguaje de programaci´on C 32 / 218
Otro ejemplo de make
CC=gcc
CFLAGS=-g
OBJS2=prac2.o aux1.o
all: prac1 prac2
prac1: prac1.o aux1.o
gcc -g -o prac1 prac1.o aux1.o
prac2: $(OBJS2)
${CC} ${CFLAGS} -o $@ ${OBJS2}
prac1.o prac2.o: prac.h
clean:
rm -f prac1.o aux1.o ${OBJS2}
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 ´ultimos 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 tama˜nos 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, n´umeros 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 may´usculas y min´usculas. El C distingue entre
may´usculas y min´usculas
La costumbre es que las variables van en min´uscula y las
constantes en may´uscula
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 tama˜nos 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 tama˜nos de datos
El C tiene pocos tipos de datos
char Un byte. Contiene un caracter (o un n´umero entre 0 y 255)
int Un entero. El tama˜no 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 tama˜no 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 tama˜nos 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 tama˜nos 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´on
float pi=3.1416;
unsigned long contador=0;
Puede utilizarse el simbol const para indicar que la variable no
puede ser cambiada
const float e=2.7182;
Sistemas Operativos El Lenguaje de programaci´on C 46 / 218
Tipos, operadores y expresiones
Nombres de variables
Tipos y tama˜nos 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("%ft%fn",fahr,celsius);
fahr=fahr+STEP;
}
}
Sistemas Operativos El Lenguaje de programaci´on C 49 / 218
Tipos, operadores y expresiones
Nombres de variables
Tipos y tama˜nos 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 l´ogicos
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 eval´uan 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 tama˜nos 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 tama˜nos 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 tama˜nos 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+=expresi´on; equivale a x=x+expresi´on;
x-=expresi´on; equivale a x=x-expresi´on;
x*=expresi´on; equivale a x=x*expresi´on;
. . .
x>> =expresi´on; 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 tama˜nos 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 eval´uan 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: %sn" (p!=NULL)? p:" error");
Sistemas Operativos El Lenguaje de programaci´on C 61 / 218
Tipos, operadores y expresiones
Nombres de variables
Tipos y tama˜nos 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 eval´uan 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 eval´uan los
par´ametros a una funci´on,
printf (‘‘%d %d’’,++i,i)
produce un resultado indeterminado
Las operaciones l´ogicas se eval´uan 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) sizeof derecha a izquierda
* / 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
= += -= *= /= %= &= |= etc derecha a izquierda
, izquierda a derecha
Sistemas Operativos El Lenguaje de programaci´on C 64 / 218
Tipos, operadores y expresiones
Nombres de variables
Tipos y tama˜nos 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 tama˜nos 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 n´umeros del 0 al 100 como caracteres sin
signo
Considerando los n´umeros del 0 al 100 como enteros cortos sin
signo
Considerando los n´umeros 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 eval´ua 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 bn");
else
printf ("n es menor que 0n");
La versi´on correcta ser´ıa
if (n>0) {
if (a>b)
printf ("a es mayor que bn");
}
else
printf ("n es menor que 0n");
Sistemas Operativos El Lenguaje de programaci´on C 72 / 218
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 m´ultiples
Se eval´uan 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 m´ultiple basada en una expresi´on
que puede tomar un n´umero 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 = %dn", 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 eval´ua expresi´on, y si es distinta de 0 se ejecuta sentencia
sentencia debe estar terminada por ;
sentencia puede ser un bloque se sentencias entre llaves { }
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 eval´ua 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;
}
...
error:
/* clean up the mess */
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 ning´un
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)
if (strindex(line, pattern) >= 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 i;
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%gn", sum += atof(line));
return 0;
}
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;
}
return sign * val / power;
}
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 %dn" 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
.....
#endif
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 alg´un
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 n´umero. 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 multidimensionales
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 multidimensionales
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 (a,b) no intercambiar´ıa los
valores de a y b, solo de sus copias
Sistemas Operativos El Lenguaje de programaci´on C 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 multidimensionales
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
tama˜no 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 multidimensionales
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("%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);
}
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 multidimensionales
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 multidimensionales
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 multidimensionales
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 tama˜no. 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; // Equivalentes
*(p[i] + j) = 0;
*(*(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 multidimensionales
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 n´umero 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 multidimensionales
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
return 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, numcmp);
Sistemas Operativos 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 multidimensionales
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
n´umero entero N; si el n´umero es positivo imprime las N
primeras l´ıneas de su entrada, y si es negativo las (-)N ´ultimas.
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;
};
struct COORDENADAS *p1, *p2;
Sistemas Operativos El Lenguaje de programaci´on C 163 / 218
c struct {
int x;
int y;
} *p1 , *p2;
Podemos acceder a los miembros de una estructura a trav´es
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 ´EL 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 tama˜no de la estructura
El tama˜no de una estructura no es necesariamente la suma del
tama˜no 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 n´umero 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", 0,
"while", 0
};
int getword(char *, int);
int binsearch(char *, struct key *, int);
Sistemas Operativos 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 %sn", keytab[n].count, keytab[n].word);
return 0;
}
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;
}
return -1;
}
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 uniones.
Sistemas Operativos 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
typedef
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 peque˜no, 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 alg´un 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
sqrt, sqrtf, sqrtl - square root function
SYNOPSIS
#include <math.h>
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);
Link with -lm.
.....
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
Asignaci´on 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 p;
}
Sistemas 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 n´umero m´ınimo de d´ıgitos que se imprimir´an para un entero
(para float n´umero 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,...) C´odigos 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: %Xn", x,n);
imprimir´ıa algo como:
real: 3.1516; entero: FF09465
Sistemas Operativos 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 n´umero de bytes de e/s
Devuelven en n´umero 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
Depuraci´on 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 depuraci´on 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!!!
}
Sistemas Operativos El Lenguaje de programaci´on C 216 / 218
Ejemplo de depuraci´on 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)
==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)
Sistemas Operativos El Lenguaje de programaci´on C 217 / 218
Ejemplo de depuraci´on 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 Seward et al.
==12056== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==12056== Command: ./a.out
==12056==
0 2 4 6 8 10 12 14 16 18 ==12056==
==12056== HEAP SUMMARY:
==12056== in use at exit: 0 bytes in 0 blocks
==12056== total heap usage: 1 allocs, 1 frees, 40 bytes allocated
==12056==
==12056== All heap blocks were freed -- no leaks are possible
==12056==
==12056== For counts of detected and suppressed errors, rerun with: -v
==12056== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6)
Sistemas Operativos El Lenguaje de programaci´on C 218 / 218

Más contenido relacionado

La actualidad más candente

Lenguaje c completo 6 g x revisar x los estudiantes
Lenguaje c completo 6 g x revisar x los estudiantesLenguaje c completo 6 g x revisar x los estudiantes
Lenguaje c completo 6 g x revisar x los estudiantesJhon Jairo C Q
 
Introduccion al lenguaje c
Introduccion al lenguaje cIntroduccion al lenguaje c
Introduccion al lenguaje cvictdiazm
 
Utp lpi_s1_introduccion al lenguaje c
 Utp lpi_s1_introduccion al lenguaje c Utp lpi_s1_introduccion al lenguaje c
Utp lpi_s1_introduccion al lenguaje cjcbenitezp
 
Utp pti_s1_introduccion al lenguaje c
 Utp pti_s1_introduccion al lenguaje c Utp pti_s1_introduccion al lenguaje c
Utp pti_s1_introduccion al lenguaje cjcbenitezp
 
Utp pti_s1_introduccion al lenguaje c
 Utp pti_s1_introduccion al lenguaje c Utp pti_s1_introduccion al lenguaje c
Utp pti_s1_introduccion al lenguaje cjcbenitezp
 
Curso de Lenguaje C
Curso de Lenguaje CCurso de Lenguaje C
Curso de Lenguaje Ctacubomx
 
Utp pti_s1_introduccion al lenguaje c
 Utp pti_s1_introduccion al lenguaje c Utp pti_s1_introduccion al lenguaje c
Utp pti_s1_introduccion al lenguaje cjcbenitezp
 
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVRMicrocontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVRSANTIAGO PABLO ALBERTO
 
Libro digital de programación
Libro digital de programaciónLibro digital de programación
Libro digital de programaciónEstefy Sanchez
 
Estructura general de un programa en lenguaje´´c´´ y sus variables
Estructura general de un programa en lenguaje´´c´´ y sus variablesEstructura general de un programa en lenguaje´´c´´ y sus variables
Estructura general de un programa en lenguaje´´c´´ y sus variablesLuz Zaragoza Chavez
 
Curso de programacion en c++ prev
Curso de programacion en c++ prevCurso de programacion en c++ prev
Curso de programacion en c++ prevjtk1
 

La actualidad más candente (17)

Unmsm02 2008
Unmsm02 2008Unmsm02 2008
Unmsm02 2008
 
Lenguaje c completo 6 g x revisar x los estudiantes
Lenguaje c completo 6 g x revisar x los estudiantesLenguaje c completo 6 g x revisar x los estudiantes
Lenguaje c completo 6 g x revisar x los estudiantes
 
Lenguaje c 2
Lenguaje c 2Lenguaje c 2
Lenguaje c 2
 
Parte i curso c
Parte i curso cParte i curso c
Parte i curso c
 
Unidad 2 curso c
Unidad 2 curso cUnidad 2 curso c
Unidad 2 curso c
 
C(++) programacion en c y c++
C(++)   programacion en c y c++C(++)   programacion en c y c++
C(++) programacion en c y c++
 
Introduccion al lenguaje c
Introduccion al lenguaje cIntroduccion al lenguaje c
Introduccion al lenguaje c
 
Utp lpi_s1_introduccion al lenguaje c
 Utp lpi_s1_introduccion al lenguaje c Utp lpi_s1_introduccion al lenguaje c
Utp lpi_s1_introduccion al lenguaje c
 
Utp pti_s1_introduccion al lenguaje c
 Utp pti_s1_introduccion al lenguaje c Utp pti_s1_introduccion al lenguaje c
Utp pti_s1_introduccion al lenguaje c
 
Utp pti_s1_introduccion al lenguaje c
 Utp pti_s1_introduccion al lenguaje c Utp pti_s1_introduccion al lenguaje c
Utp pti_s1_introduccion al lenguaje c
 
Curso de Lenguaje C
Curso de Lenguaje CCurso de Lenguaje C
Curso de Lenguaje C
 
Lenguaje c
Lenguaje cLenguaje c
Lenguaje c
 
Utp pti_s1_introduccion al lenguaje c
 Utp pti_s1_introduccion al lenguaje c Utp pti_s1_introduccion al lenguaje c
Utp pti_s1_introduccion al lenguaje c
 
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVRMicrocontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
 
Libro digital de programación
Libro digital de programaciónLibro digital de programación
Libro digital de programación
 
Estructura general de un programa en lenguaje´´c´´ y sus variables
Estructura general de un programa en lenguaje´´c´´ y sus variablesEstructura general de un programa en lenguaje´´c´´ y sus variables
Estructura general de un programa en lenguaje´´c´´ y sus variables
 
Curso de programacion en c++ prev
Curso de programacion en c++ prevCurso de programacion en c++ prev
Curso de programacion en c++ prev
 

Destacado

Utp 2015-2_sirn_s7_r_competitivas
 Utp 2015-2_sirn_s7_r_competitivas Utp 2015-2_sirn_s7_r_competitivas
Utp 2015-2_sirn_s7_r_competitivasjcbenitezp
 
Utp sirn_s1_introduccion ia 2014-2
 Utp sirn_s1_introduccion ia 2014-2 Utp sirn_s1_introduccion ia 2014-2
Utp sirn_s1_introduccion ia 2014-2jcbenitezp
 
Utp lpi_s6y7_funciones y variables 2012-2
 Utp lpi_s6y7_funciones y variables 2012-2 Utp lpi_s6y7_funciones y variables 2012-2
Utp lpi_s6y7_funciones y variables 2012-2jcbenitezp
 
Lenguaje c
Lenguaje cLenguaje c
Lenguaje clocke23
 
Utp i_ay_se_sistemas difusos i 2013-3
 Utp i_ay_se_sistemas difusos i 2013-3 Utp i_ay_se_sistemas difusos i 2013-3
Utp i_ay_se_sistemas difusos i 2013-3jcbenitezp
 
Utp sirn_sl8 sistemas difusos i 2013-3
 Utp sirn_sl8 sistemas difusos i 2013-3 Utp sirn_sl8 sistemas difusos i 2013-3
Utp sirn_sl8 sistemas difusos i 2013-3jcbenitezp
 
Presentacion libro Fundamentos del SEO en Pamplona
Presentacion libro Fundamentos del SEO en PamplonaPresentacion libro Fundamentos del SEO en Pamplona
Presentacion libro Fundamentos del SEO en PamplonaCarlos Pes
 
Utp ia_s1_introduccion ia
 Utp ia_s1_introduccion ia Utp ia_s1_introduccion ia
Utp ia_s1_introduccion iajcbenitezp
 
Lenguaje C para Administradores de Red / Script III - Memoria
Lenguaje C para Administradores de Red / Script III - MemoriaLenguaje C para Administradores de Red / Script III - Memoria
Lenguaje C para Administradores de Red / Script III - Memoriasirfids
 
Medios,modelos y estilos de aprendizaje jaime romero
Medios,modelos y estilos de aprendizaje jaime romeroMedios,modelos y estilos de aprendizaje jaime romero
Medios,modelos y estilos de aprendizaje jaime romeroJaime David Romero Olivo
 
Lenguaje C para Administradores de Red - Script I
Lenguaje C para Administradores de Red - Script ILenguaje C para Administradores de Red - Script I
Lenguaje C para Administradores de Red - Script Isirfids
 
Utp 2015-2_sirn_s6_adaline y backpropagation
 Utp 2015-2_sirn_s6_adaline y backpropagation Utp 2015-2_sirn_s6_adaline y backpropagation
Utp 2015-2_sirn_s6_adaline y backpropagationjcbenitezp
 
Generalidades del SEO
Generalidades del SEOGeneralidades del SEO
Generalidades del SEOCarlos Pes
 
Introducción a los tipos de datos
Introducción a los tipos de datosIntroducción a los tipos de datos
Introducción a los tipos de datosCarlos Pes
 
Capitulo 10 Introduccion a los diagramas de flujo
Capitulo 10 Introduccion a los diagramas de flujoCapitulo 10 Introduccion a los diagramas de flujo
Capitulo 10 Introduccion a los diagramas de flujoCarlos Pes
 
Utp i_ay_se_s10_algoritmo genéticos_
 Utp i_ay_se_s10_algoritmo genéticos_ Utp i_ay_se_s10_algoritmo genéticos_
Utp i_ay_se_s10_algoritmo genéticos_jcbenitezp
 
Asignación, Salida y Entrada
Asignación, Salida y EntradaAsignación, Salida y Entrada
Asignación, Salida y EntradaCarlos Pes
 

Destacado (20)

Utp 2015-2_sirn_s7_r_competitivas
 Utp 2015-2_sirn_s7_r_competitivas Utp 2015-2_sirn_s7_r_competitivas
Utp 2015-2_sirn_s7_r_competitivas
 
Utp sirn_s1_introduccion ia 2014-2
 Utp sirn_s1_introduccion ia 2014-2 Utp sirn_s1_introduccion ia 2014-2
Utp sirn_s1_introduccion ia 2014-2
 
Utp lpi_s6y7_funciones y variables 2012-2
 Utp lpi_s6y7_funciones y variables 2012-2 Utp lpi_s6y7_funciones y variables 2012-2
Utp lpi_s6y7_funciones y variables 2012-2
 
Lenguaje c
Lenguaje cLenguaje c
Lenguaje c
 
Utp i_ay_se_sistemas difusos i 2013-3
 Utp i_ay_se_sistemas difusos i 2013-3 Utp i_ay_se_sistemas difusos i 2013-3
Utp i_ay_se_sistemas difusos i 2013-3
 
Logica Juridica
Logica JuridicaLogica Juridica
Logica Juridica
 
Utp sirn_sl8 sistemas difusos i 2013-3
 Utp sirn_sl8 sistemas difusos i 2013-3 Utp sirn_sl8 sistemas difusos i 2013-3
Utp sirn_sl8 sistemas difusos i 2013-3
 
Presentacion libro Fundamentos del SEO en Pamplona
Presentacion libro Fundamentos del SEO en PamplonaPresentacion libro Fundamentos del SEO en Pamplona
Presentacion libro Fundamentos del SEO en Pamplona
 
Utp ia_s1_introduccion ia
 Utp ia_s1_introduccion ia Utp ia_s1_introduccion ia
Utp ia_s1_introduccion ia
 
Lenguaje C para Administradores de Red / Script III - Memoria
Lenguaje C para Administradores de Red / Script III - MemoriaLenguaje C para Administradores de Red / Script III - Memoria
Lenguaje C para Administradores de Red / Script III - Memoria
 
Medios,modelos y estilos de aprendizaje jaime romero
Medios,modelos y estilos de aprendizaje jaime romeroMedios,modelos y estilos de aprendizaje jaime romero
Medios,modelos y estilos de aprendizaje jaime romero
 
Lenguaje C para Administradores de Red - Script I
Lenguaje C para Administradores de Red - Script ILenguaje C para Administradores de Red - Script I
Lenguaje C para Administradores de Red - Script I
 
Utp 2015-2_sirn_s6_adaline y backpropagation
 Utp 2015-2_sirn_s6_adaline y backpropagation Utp 2015-2_sirn_s6_adaline y backpropagation
Utp 2015-2_sirn_s6_adaline y backpropagation
 
Generalidades del SEO
Generalidades del SEOGeneralidades del SEO
Generalidades del SEO
 
Introducción a los tipos de datos
Introducción a los tipos de datosIntroducción a los tipos de datos
Introducción a los tipos de datos
 
Capitulo 10 Introduccion a los diagramas de flujo
Capitulo 10 Introduccion a los diagramas de flujoCapitulo 10 Introduccion a los diagramas de flujo
Capitulo 10 Introduccion a los diagramas de flujo
 
Funciones en Lenguaje C
Funciones en Lenguaje CFunciones en Lenguaje C
Funciones en Lenguaje C
 
Tipos De Datos
Tipos De DatosTipos De Datos
Tipos De Datos
 
Utp i_ay_se_s10_algoritmo genéticos_
 Utp i_ay_se_s10_algoritmo genéticos_ Utp i_ay_se_s10_algoritmo genéticos_
Utp i_ay_se_s10_algoritmo genéticos_
 
Asignación, Salida y Entrada
Asignación, Salida y EntradaAsignación, Salida y Entrada
Asignación, Salida y Entrada
 

Similar a Curso c (20)

CursoC.pdf
CursoC.pdfCursoC.pdf
CursoC.pdf
 
El_Lenguaje_de_programacion_C.pptx
El_Lenguaje_de_programacion_C.pptxEl_Lenguaje_de_programacion_C.pptx
El_Lenguaje_de_programacion_C.pptx
 
IntroLenguajeC.ppt
IntroLenguajeC.pptIntroLenguajeC.ppt
IntroLenguajeC.ppt
 
2 estructura programa-c
2 estructura programa-c2 estructura programa-c
2 estructura programa-c
 
Lenguajec
LenguajecLenguajec
Lenguajec
 
2do parcial c
2do parcial c2do parcial c
2do parcial c
 
Lenguaje C
Lenguaje CLenguaje C
Lenguaje C
 
Programación en c++
Programación en c++Programación en c++
Programación en c++
 
Unidad 3
Unidad 3Unidad 3
Unidad 3
 
Programacion
ProgramacionProgramacion
Programacion
 
Lenguaje c
Lenguaje c Lenguaje c
Lenguaje c
 
Introducción a Programación I (Clase1).pptx
Introducción a Programación I (Clase1).pptxIntroducción a Programación I (Clase1).pptx
Introducción a Programación I (Clase1).pptx
 
Programación en c
Programación en cProgramación en c
Programación en c
 
Programación c
Programación cProgramación c
Programación c
 
Programación c
Programación cProgramación c
Programación c
 
programacion-Devian-C.pdf
programacion-Devian-C.pdfprogramacion-Devian-C.pdf
programacion-Devian-C.pdf
 
Lenguaje c
Lenguaje cLenguaje c
Lenguaje c
 
Lenguaje c
Lenguaje cLenguaje c
Lenguaje c
 
Lenguaje c
Lenguaje cLenguaje c
Lenguaje c
 
01 lenguaje-c
01 lenguaje-c01 lenguaje-c
01 lenguaje-c
 

Más de AnzurezBrayan

Más de AnzurezBrayan (6)

Problema 4
Problema 4Problema 4
Problema 4
 
Simbología
SimbologíaSimbología
Simbología
 
Recuperación bri
Recuperación briRecuperación bri
Recuperación bri
 
Recuperación 2 unidad
Recuperación 2 unidadRecuperación 2 unidad
Recuperación 2 unidad
 
Malinche
MalincheMalinche
Malinche
 
Simbologc3ada diagramacion1
Simbologc3ada diagramacion1Simbologc3ada diagramacion1
Simbologc3ada diagramacion1
 

Último

La Gatera de la Villa nº 51. Revista cultural sobre Madrid..
La Gatera de la Villa nº 51. Revista cultural sobre Madrid..La Gatera de la Villa nº 51. Revista cultural sobre Madrid..
La Gatera de la Villa nº 51. Revista cultural sobre Madrid..La Gatera de la Villa
 
ficha de aplicacion para estudiantes El agua para niños de primaria
ficha de aplicacion para estudiantes El agua para niños de primariaficha de aplicacion para estudiantes El agua para niños de primaria
ficha de aplicacion para estudiantes El agua para niños de primariamichel carlos Capillo Dominguez
 
Xardín de San Carlos (A Coruña) IES Monelos
Xardín de San Carlos (A Coruña) IES MonelosXardín de San Carlos (A Coruña) IES Monelos
Xardín de San Carlos (A Coruña) IES MonelosAgrela Elvixeo
 
Herbert James Drape. Erotismo y sensualidad.pptx
Herbert James Drape. Erotismo y sensualidad.pptxHerbert James Drape. Erotismo y sensualidad.pptx
Herbert James Drape. Erotismo y sensualidad.pptxArs Erótica
 
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREASEjemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREASJavier Sanchez
 
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdfPSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdfCarlosAntonio456574
 
La Congregación de Jesús y María, conocida también como los Eudistas, fue fun...
La Congregación de Jesús y María, conocida también como los Eudistas, fue fun...La Congregación de Jesús y María, conocida también como los Eudistas, fue fun...
La Congregación de Jesús y María, conocida también como los Eudistas, fue fun...Unidad de Espiritualidad Eudista
 
Recursos Tecnológicos, página AIP-CRT 2 0 2 4.pdf
Recursos Tecnológicos, página  AIP-CRT 2 0 2 4.pdfRecursos Tecnológicos, página  AIP-CRT 2 0 2 4.pdf
Recursos Tecnológicos, página AIP-CRT 2 0 2 4.pdfNELLYKATTY
 
La poesía del encarcelamiento de Raúl Zurita en el aula: una propuesta didáctica
La poesía del encarcelamiento de Raúl Zurita en el aula: una propuesta didácticaLa poesía del encarcelamiento de Raúl Zurita en el aula: una propuesta didáctica
La poesía del encarcelamiento de Raúl Zurita en el aula: una propuesta didácticaIGNACIO BALLESTER PARDO
 
Kirpi-el-erizo libro descargar pdf 1 link
Kirpi-el-erizo libro descargar pdf 1 linkKirpi-el-erizo libro descargar pdf 1 link
Kirpi-el-erizo libro descargar pdf 1 linkMaximilianoMaldonado17
 
EL ECLIPSE DE LA PAZ (cuento literario). Autor y diseñador JAVIER SOLIS NOYOLA
EL ECLIPSE DE LA PAZ (cuento literario). Autor y diseñador JAVIER SOLIS NOYOLAEL ECLIPSE DE LA PAZ (cuento literario). Autor y diseñador JAVIER SOLIS NOYOLA
EL ECLIPSE DE LA PAZ (cuento literario). Autor y diseñador JAVIER SOLIS NOYOLAJAVIER SOLIS NOYOLA
 
Tecnología educativa en la era actual .pptx
Tecnología educativa en la era actual .pptxTecnología educativa en la era actual .pptx
Tecnología educativa en la era actual .pptxJulioSantin2
 
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdfGUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdfNELLYKATTY
 
Presentación del tema: tecnología educativa
Presentación del tema: tecnología educativaPresentación del tema: tecnología educativa
Presentación del tema: tecnología educativaricardoruizaleman
 
CIENCIAS SOCIALES SEGUNDO TRIMESTRE TERCERO
CIENCIAS SOCIALES SEGUNDO TRIMESTRE TERCEROCIENCIAS SOCIALES SEGUNDO TRIMESTRE TERCERO
CIENCIAS SOCIALES SEGUNDO TRIMESTRE TERCEROCEIP TIERRA DE PINARES
 
Concurso de Innovación Pedagógica T2 FONDEP 2024 Ccesa007.pdf
Concurso de Innovación Pedagógica  T2  FONDEP 2024 Ccesa007.pdfConcurso de Innovación Pedagógica  T2  FONDEP 2024 Ccesa007.pdf
Concurso de Innovación Pedagógica T2 FONDEP 2024 Ccesa007.pdfDemetrio Ccesa Rayme
 
COMO SI EL RUIDO PUDIERA MOLESTAR 4TO SECUENCIA.docx
COMO SI EL RUIDO PUDIERA MOLESTAR 4TO SECUENCIA.docxCOMO SI EL RUIDO PUDIERA MOLESTAR 4TO SECUENCIA.docx
COMO SI EL RUIDO PUDIERA MOLESTAR 4TO SECUENCIA.docxAngeles Feu
 

Último (20)

La Gatera de la Villa nº 51. Revista cultural sobre Madrid..
La Gatera de la Villa nº 51. Revista cultural sobre Madrid..La Gatera de la Villa nº 51. Revista cultural sobre Madrid..
La Gatera de la Villa nº 51. Revista cultural sobre Madrid..
 
ficha de aplicacion para estudiantes El agua para niños de primaria
ficha de aplicacion para estudiantes El agua para niños de primariaficha de aplicacion para estudiantes El agua para niños de primaria
ficha de aplicacion para estudiantes El agua para niños de primaria
 
Xardín de San Carlos (A Coruña) IES Monelos
Xardín de San Carlos (A Coruña) IES MonelosXardín de San Carlos (A Coruña) IES Monelos
Xardín de San Carlos (A Coruña) IES Monelos
 
Herbert James Drape. Erotismo y sensualidad.pptx
Herbert James Drape. Erotismo y sensualidad.pptxHerbert James Drape. Erotismo y sensualidad.pptx
Herbert James Drape. Erotismo y sensualidad.pptx
 
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREASEjemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
Ejemplo de trabajo de TIC´s CON VARIAS OPCIONES DE LAS TAREAS
 
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdfPSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
PSICOLOGÍA. UNA INTRODUCCIÓN. ALCIRA ORSINI Y LETICIA BOSSELLINI 3.pdf
 
La Congregación de Jesús y María, conocida también como los Eudistas, fue fun...
La Congregación de Jesús y María, conocida también como los Eudistas, fue fun...La Congregación de Jesús y María, conocida también como los Eudistas, fue fun...
La Congregación de Jesús y María, conocida también como los Eudistas, fue fun...
 
Recursos Tecnológicos, página AIP-CRT 2 0 2 4.pdf
Recursos Tecnológicos, página  AIP-CRT 2 0 2 4.pdfRecursos Tecnológicos, página  AIP-CRT 2 0 2 4.pdf
Recursos Tecnológicos, página AIP-CRT 2 0 2 4.pdf
 
La poesía del encarcelamiento de Raúl Zurita en el aula: una propuesta didáctica
La poesía del encarcelamiento de Raúl Zurita en el aula: una propuesta didácticaLa poesía del encarcelamiento de Raúl Zurita en el aula: una propuesta didáctica
La poesía del encarcelamiento de Raúl Zurita en el aula: una propuesta didáctica
 
EL PROCESO DE INVESTIGACIÓN CUALITATIVA. ENFERMERÍA
EL PROCESO DE INVESTIGACIÓN CUALITATIVA. ENFERMERÍAEL PROCESO DE INVESTIGACIÓN CUALITATIVA. ENFERMERÍA
EL PROCESO DE INVESTIGACIÓN CUALITATIVA. ENFERMERÍA
 
Kirpi-el-erizo libro descargar pdf 1 link
Kirpi-el-erizo libro descargar pdf 1 linkKirpi-el-erizo libro descargar pdf 1 link
Kirpi-el-erizo libro descargar pdf 1 link
 
EL ECLIPSE DE LA PAZ (cuento literario). Autor y diseñador JAVIER SOLIS NOYOLA
EL ECLIPSE DE LA PAZ (cuento literario). Autor y diseñador JAVIER SOLIS NOYOLAEL ECLIPSE DE LA PAZ (cuento literario). Autor y diseñador JAVIER SOLIS NOYOLA
EL ECLIPSE DE LA PAZ (cuento literario). Autor y diseñador JAVIER SOLIS NOYOLA
 
Sesión de clase ES: Adoración sin fin...
Sesión de clase ES: Adoración sin fin...Sesión de clase ES: Adoración sin fin...
Sesión de clase ES: Adoración sin fin...
 
Tecnología educativa en la era actual .pptx
Tecnología educativa en la era actual .pptxTecnología educativa en la era actual .pptx
Tecnología educativa en la era actual .pptx
 
VISITA DE ESTUDO À CRUZ VERMELHA _
VISITA DE ESTUDO À CRUZ VERMELHA                   _VISITA DE ESTUDO À CRUZ VERMELHA                   _
VISITA DE ESTUDO À CRUZ VERMELHA _
 
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdfGUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
GUÍA SIANET - Agenda - Tareas - Archivos - Participaciones - Notas.pdf
 
Presentación del tema: tecnología educativa
Presentación del tema: tecnología educativaPresentación del tema: tecnología educativa
Presentación del tema: tecnología educativa
 
CIENCIAS SOCIALES SEGUNDO TRIMESTRE TERCERO
CIENCIAS SOCIALES SEGUNDO TRIMESTRE TERCEROCIENCIAS SOCIALES SEGUNDO TRIMESTRE TERCERO
CIENCIAS SOCIALES SEGUNDO TRIMESTRE TERCERO
 
Concurso de Innovación Pedagógica T2 FONDEP 2024 Ccesa007.pdf
Concurso de Innovación Pedagógica  T2  FONDEP 2024 Ccesa007.pdfConcurso de Innovación Pedagógica  T2  FONDEP 2024 Ccesa007.pdf
Concurso de Innovación Pedagógica T2 FONDEP 2024 Ccesa007.pdf
 
COMO SI EL RUIDO PUDIERA MOLESTAR 4TO SECUENCIA.docx
COMO SI EL RUIDO PUDIERA MOLESTAR 4TO SECUENCIA.docxCOMO SI EL RUIDO PUDIERA MOLESTAR 4TO SECUENCIA.docx
COMO SI EL RUIDO PUDIERA MOLESTAR 4TO SECUENCIA.docx
 

Curso c

  • 1. El Lenguaje de programaci´on C Sistemas Operativos Universidade da Coru˜na Sistemas Operativos El Lenguaje de programaci´on C 1 / 218
  • 2. 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 tama˜nos 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
  • 3. 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
  • 4. 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 multidimensionales Sistemas Operativos El Lenguaje de programaci´on C 4 / 218
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. 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
  • 9. 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, n´umeros . . . ; 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
  • 10. 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
  • 11. 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
  • 12. 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
  • 13. Cada bloque puede contener directivas del precompilador declaraciones una o m´as sentencias comentarios Sistemas Operativos El Lenguaje de programaci´on C 13 / 218
  • 14. 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
  • 15. 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
  • 16. Primeros ejemplos #include <stdio.h> main() { printf("hola, primer programa en Cn"); } Sistemas Operativos El Lenguaje de programaci´on C 16 / 218
  • 17. #include <stdio.h> main() { int fahr, celsius; int lower, upper, step; lower=0; upper=300; step=20; fahr=lower; while(fahr<=upper) { celsius=5*(fahr-32)/9; printf("%dt%dn",fahr,celsius); fahr=fahr+step; } } Sistemas Operativos El Lenguaje de programaci´on C 17 / 218
  • 18. Introducci´on 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
  • 19. Compilaci´on 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
  • 20. 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
  • 21. 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/include). Por ejemplo #include <stdio.h> hace que el fichero /usr/include/stdio.h se incluya en ese punto para ser compilado con nuestro fichero fuente El nombre se puede poner entre comillas (“) y el sistema lo buscar´a en el directorio actual (tambi´en se puede poner una ruta absoluta) Los ficheros se suelen denominar .h y contienen declaraciones de tipos, variables y prototipos de funciones (son ficheros fuente que pueden verse) Sistemas Operativos El Lenguaje de programaci´on C 21 / 218
  • 22. #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 may´usculas y min´usculas, aunque la costumbre es utilizar may´usculas para los s´ımbolos definidos por el preprocesador ejemplo #define MAX 1024 hace que todas las ocurrencias de la cadena MAX dentro del c´odigo son sustituidas por 1024 El c´odigo que se compila lleva 1024 donde iba MAX Si MAX iba dentro de comillas ’’...‘‘, no se sustituye Sistemas Operativos El Lenguaje de programaci´on C 22 / 218
  • 23. #include <stdio.h> #define UPPER 300 #define LOWER 0 #define STEP 20 main() { int fahr, celsius; fahr=LOWER; while(fahr<=UPPER) { celsius=5*(fahr-32)/9; printf("%dt%dn",fahr,celsius); fahr=fahr+STEP; } } Sistemas Operativos El Lenguaje de programaci´on C 23 / 218
  • 24. Introducci´on 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
  • 25. Depuraci´on 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, mediante help Sistemas Operativos El Lenguaje de programaci´on C 25 / 218
  • 26. 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
  • 27. make 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
  • 28. 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 correspondiente a objetivo Trata sus dependencias como objetivos y las resuelve recursivamente Dentro del Makefile se pueden definir variables (y acceder a sus valores) como en el shell: VAR=valor para definir la variable y ${VAR} o $(VAR) para acceder a su valor. $@ se refiere al nombre del objetivo Sistemas Operativos El Lenguaje de programaci´on C 28 / 218
  • 29. 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); y funcion2.h #define MAX2 2000 void funcion2(void); Sistemas Operativos El Lenguaje de programaci´on C 29 / 218
  • 30. 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) { int j=MAX2; return; } Sistemas Operativos El Lenguaje de programaci´on C 30 / 218
  • 31. 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
  • 32. Ejemplo muy sencillo de make El siguiente archivo Makefile se ocupa de decidir que hay que compilar y hacerlo programa.out: programa.c funcion1.h funcion2.h funcion1.o funcion2.o gcc -o programa.out programa.c funcion2.o funcion1.o funcion1.o: funcion1.h funcion1.c gcc -c funcion1.o funcion1.c funcion2.o: funcion2.h funcion2.c gcc -c funcion2.o funcion2.c limpiar: rm programa.out funcion1.o funcion2.o Sistemas Operativos El Lenguaje de programaci´on C 32 / 218
  • 33. Otro ejemplo de make CC=gcc CFLAGS=-g OBJS2=prac2.o aux1.o all: prac1 prac2 prac1: prac1.o aux1.o gcc -g -o prac1 prac1.o aux1.o prac2: $(OBJS2) ${CC} ${CFLAGS} -o $@ ${OBJS2} prac1.o prac2.o: prac.h clean: rm -f prac1.o aux1.o ${OBJS2} Sistemas Operativos El Lenguaje de programaci´on C 33 / 218
  • 34. 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
  • 35. 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 ´ultimos 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
  • 36. 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
  • 37. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 38. Nombres de variables los nombres de variables pueden tener letras, n´umeros 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 may´usculas y min´usculas. El C distingue entre may´usculas y min´usculas La costumbre es que las variables van en min´uscula y las constantes en may´uscula Las palabras reservadas if, else . . . no pueden usarse como nombres de variables Sistemas Operativos El Lenguaje de programaci´on C 38 / 218
  • 39. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 40. Tipos y tama˜nos de datos El C tiene pocos tipos de datos char Un byte. Contiene un caracter (o un n´umero entre 0 y 255) int Un entero. El tama˜no 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 tama˜no 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
  • 41. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 42. 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
  • 43. 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
  • 44. 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
  • 45. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 46. 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´on float pi=3.1416; unsigned long contador=0; Puede utilizarse el simbol const para indicar que la variable no puede ser cambiada const float e=2.7182; Sistemas Operativos El Lenguaje de programaci´on C 46 / 218
  • 47. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 48. 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
  • 49. #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("%ft%fn",fahr,celsius); fahr=fahr+STEP; } } Sistemas Operativos El Lenguaje de programaci´on C 49 / 218
  • 50. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 51. Operadores de relaci´on y l´ogicos 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
  • 52. Operadores l´ogicos && AND || OR ! NOT Los operadores l´ogicos se eval´uan 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
  • 53. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 54. 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
  • 55. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 56. 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
  • 57. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 58. 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
  • 59. x+=expresi´on; equivale a x=x+expresi´on; x-=expresi´on; equivale a x=x-expresi´on; x*=expresi´on; equivale a x=x*expresi´on; . . . x>> =expresi´on; 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
  • 60. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 61. Expresi´on condicional Es de la forma expre1?expre2 : expre3 Se eval´uan 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: %sn" (p!=NULL)? p:" error"); Sistemas Operativos El Lenguaje de programaci´on C 61 / 218
  • 62. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 63. Precedencia y orden e evaluaci´on El C no especifica en que orden se eval´uan 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 eval´uan los par´ametros a una funci´on, printf (‘‘%d %d’’,++i,i) produce un resultado indeterminado Las operaciones l´ogicas se eval´uan 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
  • 64. OPERADORES asociatividad () [] -> . izquierda a derecha ! ~ ++ -- - * & (tipo) sizeof derecha a izquierda * / 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 = += -= *= /= %= &= |= etc derecha a izquierda , izquierda a derecha Sistemas Operativos El Lenguaje de programaci´on C 64 / 218
  • 65. Tipos, operadores y expresiones Nombres de variables Tipos y tama˜nos 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
  • 66. Ejercicios Escribir un programa en C que nos imprima los tama˜nos 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 n´umeros del 0 al 100 como caracteres sin signo Considerando los n´umeros del 0 al 100 como enteros cortos sin signo Considerando los n´umeros del 0 al 100 como enteros largos sin signo Sistemas Operativos El Lenguaje de programaci´on C 66 / 218
  • 67. 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
  • 68. 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
  • 69. 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
  • 70. 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
  • 71. if else if (expresi´on) sentencia1 else sentencia2 Se eval´ua 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
  • 72. 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 bn"); else printf ("n es menor que 0n"); La versi´on correcta ser´ıa if (n>0) { if (a>b) printf ("a es mayor que bn"); } else printf ("n es menor que 0n"); Sistemas Operativos El Lenguaje de programaci´on C 72 / 218
  • 73. Control de flujo 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
  • 74. else-if if (expresi´on1) sentencia1 else if(expresi´on2) sentencia2 else if(expresi´on3) sentencia3 . . . else sentencian Permite tomar decisiones m´ultiples Se eval´uan en orden Sistemas Operativos El Lenguaje de programaci´on C 74 / 218
  • 75. 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
  • 76. switch switch (expresi´on) { case constante1: sentencias case constante2: sentencias case constante3: sentencias . . . default: sentencias } Permite tomar una decisi´on m´ultiple basada en una expresi´on que puede tomar un n´umero 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
  • 77. #include <stdio.h> main() /* count digits, white space, others */ { int c, i, nwhite, nother, ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; i++) ndigit[i] = 0; while ((c = getchar()) != EOF) { switch (c) { case ’0’: case ’1’: case ’2’: case ’3’: case ’4’: case ’5’: case ’6’: case ’7’: case ’8’: case ’9’: ndigit[c-’0’]++; break; case ’ ’: case ’n’: case ’t’: nwhite++; break; default: nother++; break; } } printf("digits ="); for (i = 0; i < 10; i++) printf(" %d", ndigit[i]); printf(", white space = %d, other = %dn", nwhite, nother); return 0; } Sistemas Operativos El Lenguaje de programaci´on C 77 / 218
  • 78. Control de flujo 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
  • 79. bucleswhile, for y do..while while (expresi´on) sentencia Se eval´ua expresi´on, y si es distinta de 0 se ejecuta sentencia sentencia debe estar terminada por ; sentencia puede ser un bloque se sentencias entre llaves { } Sistemas Operativos El Lenguaje de programaci´on C 79 / 218
  • 80. int strlen(char s[]) { int i; i=0; while (s[i]!= ’0’) ++i; return i; } Sistemas Operativos El Lenguaje de programaci´on C 80 / 218
  • 81. for (expr1; expr2; expr3) sentencia Equivale exactamente a expr1; while (expr2){ sentencia expr3; } La expresiones del for, 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
  • 82. int atoi(char s[]) { int i, n; n=0; for(i=0; s[i]>=’0’ && s[i]<=’9’; ++i) n=10*n+(s[i]-’0’); return n; } Sistemas Operativos El Lenguaje de programaci´on C 82 / 218
  • 83. do sentencia while (expresi´on) Se ejecuta sentencia y despu´es se eval´ua 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
  • 84. 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
  • 85. 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
  • 86. 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
  • 87. 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; } ... error: /* clean up the mess */ Sistemas Operativos El Lenguaje de programaci´on C 87 / 218
  • 88. 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
  • 89. 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
  • 90. 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
  • 91. 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
  • 92. 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
  • 93. 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 ning´un valor se usa el t´ermino void void funcion_nada(void) Sistemas Operativos El Lenguaje de programaci´on C 93 / 218
  • 94. #include <stdio.h> #define MAXLINE 1000 /* maximum input line length */ int getline(char line[], int max) int strindex(char source[], char searchfor[]); char pattern[] = "ould"; /* pattern to search for */ /* find all lines matching pattern */ main() { char line[MAXLINE]; int found = 0; while (getline(line, MAXLINE) > 0) if (strindex(line, pattern) >= 0) { Sistemas Operativos El Lenguaje de programaci´on C 94 / 218
  • 95. printf("%s", line); found++; } return found; } /* getline: get line into s, return length */ int getline(char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c=getchar()) != EOF && c != ’n’) s[i++] = c; if (c == ’n’) s[i++] = c; s[i] = ’0’; return i; Sistemas Operativos El Lenguaje de programaci´on C 95 / 218
  • 96. } /* strindex: return index of t in s, -1 if none */ int strindex(char s[], char t[]) { int i, j, k; for (i = 0; s[i] != ’0’; i++) { for (j=i, k=0; t[k]!=’0’ && s[j]==t[k]; j++, k++) ; if (k > 0 && t[k] == ’0’) return i; } return -1; } Sistemas Operativos El Lenguaje de programaci´on C 96 / 218
  • 97. 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
  • 98. 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
  • 99. 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
  • 100. #include <stdio.h> #include <ctype.h> #define MAXLINE 100 /* rudimentary calculator */ main() { double sum, atof(char []); //<-- Declaraci´on funci´on char line[MAXLINE]; int getline(char line[], int max); sum = 0; while (getline(line, MAXLINE) > 0) printf("t%gn", sum += atof(line)); return 0; } Sistemas Operativos El Lenguaje de programaci´on C 100 / 218
  • 101. double atof(char s[]) { double val, power; int i, sign; for (i = 0; isspace(s[i]); i++) /* skip white space */ ; sign = (s[i] == ’-’) ? -1 : 1; if (s[i] == ’+’ || s[i] == ’-’) i++; for (val = 0.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - ’0’); if (s[i] == ’.’) i++; for (power = 1.0; isdigit(s[i]); i++) { val = 10.0 * val + (s[i] - ’0’); power *= 10; } return sign * val / power; } Sistemas Operativos El Lenguaje de programaci´on C 101 / 218
  • 102. Funciones y estructura de un programa 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
  • 103. 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
  • 104. 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
  • 105. 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
  • 106. 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 %dn" 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
  • 107. 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
  • 108. 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
  • 109. 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
  • 110. 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
  • 111. 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
  • 112. 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
  • 113. 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
  • 114. 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 ..... #endif Sistemas Operativos El Lenguaje de programaci´on C 114 / 218
  • 115. Puede dejarse sin efecto una definici´on #undef MAXIMO Puede comprobarse si se han definido s´ımbolos con alg´un 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
  • 116. 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
  • 117. 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 n´umero. Imprimir los 20 primeros factoriales Sistemas Operativos El Lenguaje de programaci´on C 117 / 218
  • 118. 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
  • 119. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 120. 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
  • 121. Organizaci´on de Memoria: Ejemplo Sistemas Operativos El Lenguaje de programaci´on C 121 / 218
  • 122. 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
  • 123. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 124. 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 (a,b) no intercambiar´ıa los valores de a y b, solo de sus copias Sistemas Operativos El Lenguaje de programaci´on C 124 / 218
  • 125. 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
  • 126. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 127. Operaciones sobre punteros C permite las siguientes operaciones sobre punteros puntero + entero La suma (y la resta), tienen en cuenta el tama˜no 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
  • 128. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 129. 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
  • 130. , 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
  • 131. , 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
  • 132. , 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
  • 133. #include <stdio.h> char a[2][5] = {{11,12,13,14,15}, {21,22,23,24,25}}; main() { char *p; // puntero a char char (*q)[5]; // puntero a un array de 5 chars char *r[5]; // array de 5 punteros a char p = &(a[0][0]); printf("%dn", p[0]); p++; printf("%dn", p[0]); q = &(a[0]); 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); } Sistemas Operativos El Lenguaje de programaci´on C 133 / 218
  • 134. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 135. 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
  • 136. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 137. 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
  • 138. static char daytab[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; /* day_of_year: set day of year from month & day */ int day_of_year(int year, int month, int day) { int i, leap; leap = year%4 == 0 && year%100 != 0 || year%400 == 0; for (i = 1; i < month; i++) day += daytab[leap][i]; return day; } Sistemas Operativos El Lenguaje de programaci´on C 138 / 218
  • 139. /* month_day: set month, day from day of year */ void month_day(int year, int yearday, int *pmonth, int *pday) { int i, leap; leap = year%4 == 0 && year%100 != 0 || year%400 == 0; for (i = 1; yearday > daytab[leap][i]; i++) yearday -= daytab[leap][i]; *pmonth = i; *pday = yearday; } Sistemas Operativos El Lenguaje de programaci´on C 139 / 218
  • 140. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 141. 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
  • 142. 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 tama˜no. Esto es especialmente interesante cuando queremos cadenas de caracteres Sistemas Operativos El Lenguaje de programaci´on C 142 / 218
  • 143. 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
  • 144. 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
  • 145. Acceso a elementos de la matriz 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; } } 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
  • 146. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 147. 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 n´umero 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
  • 148. #include <stdio.h> /* echo command-line arguments; 1st version */ int main(int argc, char *argv[]) { int i; for (i = 1; i < argc; i++) printf("%s%s", argv[i], (i < argc-1) ? " " : ""); printf("n"); return 0; } Sistemas Operativos El Lenguaje de programaci´on C 148 / 218
  • 149. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 150. 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
  • 151. /* Qsort: sort v[left]...v[right] into increasing order */ void Qsort(void *v[], int left, int right, int (*comp)(void *, void *)) { int i, last; void swap(void *v[], int, int); if (left >= right) /* do nothing if array contains */ return; /* fewer than two elements */ swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if ((*comp)(v[i], v[left]) < 0) swap(v, ++last, i); Sistemas Operativos El Lenguaje de programaci´on C 151 / 218
  • 152. swap(v, left, last); qsort(v, left, last-1, comp); qsort(v, last+1, right, comp); } Sistemas Operativos El Lenguaje de programaci´on C 152 / 218
  • 153. Si quisi´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 return 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, numcmp); Sistemas Operativos El Lenguaje de programaci´on C 153 / 218
  • 154. Arrays y punteros Punteros y direcciones Punteros y argumentos a funciones Operaciones sobre punteros Arrays y punteros Arrays de punteros Arrays multidimensionales 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
  • 155. 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 n´umero entero N; si el n´umero es positivo imprime las N primeras l´ıneas de su entrada, y si es negativo las (-)N ´ultimas. 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
  • 156. 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
  • 157. 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
  • 158. 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
  • 159. 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
  • 160. 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
  • 161. 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
  • 162. 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
  • 163. 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; }; struct COORDENADAS *p1, *p2; Sistemas Operativos El Lenguaje de programaci´on C 163 / 218
  • 164. c struct { int x; int y; } *p1 , *p2; Podemos acceder a los miembros de una estructura a trav´es 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
  • 165. 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 ´EL 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 tama˜no de la estructura El tama˜no de una estructura no es necesariamente la suma del tama˜no de sus miembros struct CORD *p; p=(struct CORD *) malloc (MAX * sizeof (struct CORD)); Sistemas Operativos El Lenguaje de programaci´on C 165 / 218
  • 166. 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
  • 167. 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 n´umero de palabras reservadas de C que se utilizan en un fichero Sistemas Operativos El Lenguaje de programaci´on C 167 / 218
  • 168. #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", 0, "while", 0 }; int getword(char *, int); int binsearch(char *, struct key *, int); Sistemas Operativos El Lenguaje de programaci´on C 168 / 218
  • 169. /* count C keywords */ main() { int n; char word[MAXWORD]; while (getword(word, MAXWORD) != EOF) if (isalpha(word[0])) if ((n = binsearch(word, keytab, NKEYS)) >= 0) keytab[n].count++; for (n = 0; n < NKEYS; n++) if (keytab[n].count > 0) printf("%4d %sn", keytab[n].count, keytab[n].word); return 0; } Sistemas Operativos El Lenguaje de programaci´on C 169 / 218
  • 170. /* binsearch: find word in tab[0]...tab[n-1] */ int binsearch(char *word, struct key tab[], int n) { int cond; int low, high, mid; low = 0; high = n - 1; while (low <= high) { mid = (low+high) / 2; if ((cond = strcmp(word, tab[mid].word)) < 0) high = mid - 1; else if (cond > 0) low = mid + 1; else return mid; } return -1; } Sistemas Operativos El Lenguaje de programaci´on C 170 / 218
  • 171. Estructuras 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
  • 172. 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
  • 173. 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
  • 174. 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 uniones. Sistemas Operativos El Lenguaje de programaci´on C 174 / 218
  • 175. 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
  • 176. 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
  • 177. 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
  • 178. 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
  • 179. typedef 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
  • 180. 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
  • 181. 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
  • 182. 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
  • 183. 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
  • 184. Biblioteca C El lenguaje C es muy peque˜no, 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
  • 185. 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
  • 186. 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 alg´un 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 sqrt, sqrtf, sqrtl - square root function SYNOPSIS #include <math.h> double sqrt(double x); float sqrtf(float x); long double sqrtl(long double x); Link with -lm. ..... Sistemas Operativos El Lenguaje de programaci´on C 186 / 218
  • 187. 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
  • 188. Asignaci´on 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
  • 189. 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
  • 190. 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
  • 191. 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
  • 192. 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
  • 193. 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
  • 194. 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
  • 195. 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
  • 196. 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
  • 197. void strcpy(char *s, char *t) { int i=0; while ((s[i] = t[i]) != ’0’) i++; } char *strdup(char *s) /* make a duplicate of s */ { char *p = (char *) malloc(strlen(s)+1); if (p == NULL) return NULL; strcpy(p, s); return p; } Sistemas Operativos El Lenguaje de programaci´on C 197 / 218
  • 198. 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
  • 199. 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
  • 200. 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
  • 201. 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 n´umero m´ınimo de d´ıgitos que se imprimir´an para un entero (para float n´umero 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
  • 202. El caracter de conversi´on especifica qu´e hay que imprimir Especificaciones de conversi´on (%u, %d,...) C´odigos 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: %Xn", x,n); imprimir´ıa algo como: real: 3.1516; entero: FF09465 Sistemas Operativos El Lenguaje de programaci´on C 202 / 218
  • 203. 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
  • 204. 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
  • 205. 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
  • 206. 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
  • 207. 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
  • 208. 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
  • 209. 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
  • 210. 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 n´umero de bytes de e/s Devuelven en n´umero 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
  • 211. 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
  • 212. 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
  • 213. 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
  • 214. Herramientas Valgrind Sistemas Operativos El Lenguaje de programaci´on C 214 / 218
  • 215. Depuraci´on 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
  • 216. Ejemplo de depuraci´on 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!!! } Sistemas Operativos El Lenguaje de programaci´on C 216 / 218
  • 217. Ejemplo de depuraci´on 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) ==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) Sistemas Operativos El Lenguaje de programaci´on C 217 / 218
  • 218. Ejemplo de depuraci´on 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 Seward et al. ==12056== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info ==12056== Command: ./a.out ==12056== 0 2 4 6 8 10 12 14 16 18 ==12056== ==12056== HEAP SUMMARY: ==12056== in use at exit: 0 bytes in 0 blocks ==12056== total heap usage: 1 allocs, 1 frees, 40 bytes allocated ==12056== ==12056== All heap blocks were freed -- no leaks are possible ==12056== ==12056== For counts of detected and suppressed errors, rerun with: -v ==12056== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6) Sistemas Operativos El Lenguaje de programaci´on C 218 / 218