Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

Uso Memoria


Allocazione Dinamica della Memoria

In C, non esistono concetti di classi come in linguaggi di programmazione orientati agli oggetti, come C++. Tuttavia, è possibile definire variabili con diverse classi di memorizzazione, come `auto`, `static`, e `register`.

Classi di Memorizzazione

`auto`


La parola chiave `auto` viene utilizzata per dichiarare variabili locali all'interno di una funzione, ma la sua utilità è stata ridotta con l'evoluzione del linguaggio e viene spesso omessa, poiché la maggior parte delle variabili locali è già automatica.



#include <stdio.h>

int main() {
    auto int x = 5;  // Dichiarazione equivalente a int x = 5;

    printf("%d\n", x);

    return 0;
}

`static`


La parola chiave `static` viene utilizzata per definire variabili che mantengono il loro valore tra le chiamate di una funzione.
Può anche essere utilizzata per limitare la visibilità di variabili e funzioni a livello di file.



#include <stdio.h>


void funzione() {
    static int conteggio = 0;
    conteggio++;

    printf("Conteggio: %d\n", conteggio);
}

int main() {
    funzione();
    funzione();
    funzione();

    return 0;
}

`register`


La parola chiave `register` viene utilizzata per dichiarare variabili locali che possono essere archiviate nei registri della CPU, rendendole più veloci da accedere rispetto alla memoria. Tuttavia, il compilatore può ignorare la richiesta di utilizzare un registro.



#include <stdio.h>

int main() {
    register int i;

    for (i = 0; i < 5; i++) {
        printf("%d ", i);
    }

    return 0;
}

Allocazione Dinamica della Memoria


`malloc` e `free`


La funzione `malloc` (Memory Allocation) viene utilizzata per allocare una quantità specifica di memoria dinamica. La funzione `free` viene utilizzata per liberare la memoria allocata.



#include <stdio.h>
#include <stdlib.h>

int main() {
    int* array;

    // Allocazione di memoria per un array di 5 interi
    array = (int*)malloc(5 * sizeof(int));

    if (array == NULL) {
        printf("Errore di allocazione di memoria.\n");
        return 1;
    }

    // Utilizzo dell'array
    for (int i = 0; i < 5; i++) {
        array[i] = i;
        printf("%d ", array[i]);
    }

    // Liberazione della memoria
    free(array);

    return 0;
}

`calloc` e `realloc`


La funzione `calloc` (Contiguous Allocation) viene utilizzata per allocare una quantità specifica di memoria inizializzata a zero.
La funzione `realloc` (Reallocate) viene utilizzata per ridimensionare o modificare l'allocazione di memoria precedentemente allocata.



#include <stdio.h>
#include <stdlib.h>

int main() {
    int* array;

    // Allocazione di memoria per un array di 3 interi inizializzati a zero
    array = (int*)calloc(3, sizeof(int));

    if (array == NULL) {
        printf("Errore di allocazione di memoria.\n");
        return 1;
    }

    // Utilizzo dell'array
    for (int i = 0; i < 3; i++) {
        printf("%d ", array[i]);
    }

    // Ridimensionamento dell'array a 5 elementi utilizzando realloc
    array = (int*)realloc(array, 5 * sizeof(int));

    if (array == NULL) {
        printf("Errore di riallocazione di memoria.\n");
        return 1;
    }

    // Utilizzo dell'array dopo la riallocazione
    for (int i = 0; i < 5; i++) {
        array[i] = i;
        printf("%d ", array[i]);
    }

    // Liberazione della memoria
    free(array);

    return 0;
}


Le funzioni `malloc`, `calloc`, e `realloc` forniscono un mezzo per gestire la memoria dinamica in C, ma è importante ricordare di liberare la memoria utilizzando `free` per evitare perdite di memoria.