Saltar a contenido

Args de Programa

Esta lecci贸n atiende a los siguientes objetivos:
- Entender el almacenamiento en memoria de los diferentes tipos de datos
- Entender el paso de argumentos en la l铆nea de orden
- Consolidar la idea de programa multisource en C
- Repasar formateo de la salida est谩ndar con printf() y fprintf()
- Presentar el uso b谩sico de los punteros en C

Almacenamiento de los tipos datos. Volcado (dump) de un 谩rea de memoria

La figura siguiente muestra un bloque de celdas de memoria consecutivas cuyas direcciones, en hexadecimal, corresponden al intervalo [0x90000000, 0x90000011]. Est谩 谩rea de memoria almacena cuatro variables:
- iii de tipo int con el valor decimal 255
- sss de tipo short con el valor decimal -1
- ddd de tipo double 0x001fffffffffffff (1.4916681462400412e-154)
- ptr de tipo int* (es una direcci贸n)

memory_layout.png

Operador sizeof()

  • Es un operador unario (no una funci贸n) que se resuelve en tiempo de compilaci贸n
  • Es decir, instruye al compilador para calcular el tama帽o en bytes de una variable o tipo de dato antes de que el programa se ejecute
  • Devuelve un resultado de tipo size_t que es normalmente un tipo entero
    sizeof.c
    #include <stdio.h>
    #include <float.h>
    
    int main() {
        char carr[3] = {'a', 'b', 'c'};
        int iarr[3] = {1, 2, 3};
    
        printf("Memoria requerida (bytes) por el tipo char : %d \n", (int) sizeof(char));
        printf("Memoria requerida (bytes) por el tipo int : %d \n", (int) sizeof(int));
        printf("Memoria requerida (bytes) por el tipo float : %d \n", (int) sizeof(float));
        printf("M铆nimo valor float positivo: %E\n", FLT_MIN );
        printf("M谩ximo valor float positivo: %E\n", FLT_MAX );
        printf("Precisi贸n: %d\n", FLT_DIG );
    
        printf("Memoria requerida (bytes) por carr : %d \n", (int) sizeof(carr));
        printf("Memoria requerida (bytes) iarr : %d (OJO!!) \n", (int) sizeof(iarr));
    
        return 0;
    }
    

Argumentos de main

La funci贸n main admite hasta tres argumentos:
- argc: un valor entero que determina el n煤mero de argumentos
- argv[]: un array de punteros (direcciones de memoria)
- env_var_ptr: una doble indirecci贸n (puntero a otro puntero)

Cabecera de main

int main (int argc, char *argv[], char **env_var_ptr)

Ejemplo de invocaci贸n de programa

./name_box Cranston Q. Snort

argv.png

C贸digo de ejemplo

A) Versi贸n b谩sica (sin env_var_ptr)

El siguiente c贸digo muestra en pantalla los argumentos con los que se ha invocado al programa

#include <stdio.h>

#define OK 0
#define KO -1

int main (int argc, char *argv[]) {

    int i=0;

    printf("\nEl n潞 de argumentos de cmdlineV0 es %d", argc);

/* El primer elemento del array de argumentos es el nombre del ejecutable */
    printf("\nnombre (arg0) = %s", argv[0]);
/* El bucle muestra el resto de argumentos */
    for (i=1; i < argc; i++) {
        printf("\narg%d = %s", i, argv[i]);
    }

    printf("\n");

    return OK;
}

B) Versi贸n con env_var_ptr

En este caso se muestra adem谩s el valor las variables de entorno

#include <stdio.h>

#define OK 0
#define KO -1

/*
 * Exacto al ej. anterior pero mostrando las variables del entorno
 */

int main (int argc, char *argv[], char **env_var_ptr) {
    int i=0;

    printf("\nEl n潞 de argumentos de cmdlineV0 es %d", argc);

/* El primer elemento del array de argumentos es el nombre del ejecutable */
    printf("\nnombre (arg0) = %s", argv[0]);
    /* El bucle muestra el resto de argumentos */
    for (i=1; i< argc; i++) {
        printf("\narg%d = %s", i, argv[i]);
    }

    printf("\n\n=============\n");
    /* Mostrar variables de entorno */
    printf("\nVars entorno:\n");
    i=0;
    while (*env_var_ptr != NULL) {
        i++;
        printf ("\nVar_Entorno%d => %s", i, *(env_var_ptr++));
    }

    printf("\n");
    return OK;
}



Lectura recomendada

Ba煤l de Linux