Strumenti Utente

Strumenti Sito


fisica:informatica:201718:esercitazioni:esercitazione8

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Prossima revisione
Revisione precedente
fisica:informatica:201718:esercitazioni:esercitazione8 [26/02/2018 alle 12:11 (7 anni fa)] – creata Susanna Pelagattifisica:informatica:201718:esercitazioni:esercitazione8 [06/03/2019 alle 13:53 (6 anni fa)] (versione attuale) – [Esercizio 5: Effetti collaterali indesiderati] Susanna Pelagatti
Linea 42: Linea 42:
 Verificare la corretta allocazione e gestire gli errori. Verificare la corretta allocazione e gestire gli errori.
  
-===== Esercizio 5: Funzione di allocazione/deallocazione di matrici =====+ 
 +===== Esercizio 5: Effetti collaterali indesiderati ===== 
 + 
 +Se ho una variabile intera "int i", posso modificarne il valore con una funzione che riceve un puntatore "&i" (di tipo ''int *'' ) alla cella di memoria di "i"
 + 
 +Allo stesso modo, se ho un array di interi '' int * a'', posso modificarne il valore, ovvero creare un nuovo array a cui ''a'' e' un riferimento con una funzione che riceve un puntatore ''&a'' (di tipo ''int * * '') alla cella di memoria di a. 
 + 
 +Le due funzioni ''array1()'' e ''array2()'' qui sotto tentano di fare proprio questo. Tuttavia, dopo aver inizializzato l'array B notiamo che il contenuto dell'array A e' cambiato.  
 +Qual'e' il motivo di questo comportamento? (//suggerimento//: guardare le slides su VLA) 
 + 
 +<code> 
 +#include <stdio.h> 
 + 
 +// questa funzione riceve un puntatore ad un array di interi, ed ha il compito di creare un array in qu 
 +void array1(int ** c); 
 + 
 +// questa funzione si comporta come array1 ma crea un array differente 
 +void array2(int ** c); 
 + 
 + 
 +int main(){ 
 + 
 + int * aA; // array A 
 + int * aB; // array B 
 + 
 + array1(&aA); 
 + 
 + printf("array A: %d, %d, %d \n",aA[0],aA[1],aA[2]); 
 + 
 + array2(&aB); 
 + 
 + printf("array B: %d, %d, %d \n",aB[0],aB[1],aB[2]); 
 + 
 + // ma nel frattempo, cosa e' successo all'array A? 
 + printf("array A: %d, %d, %d \n",aA[0],aA[1],aA[2]); 
 + 
 +    return 0; 
 +
 + 
 + 
 +void array1(int ** c){ 
 + 
 + int n = 3; 
 + 
 +// avendo usato a[n], la dimensione non e' nota a tempo di compilazione 
 +// quindi non possiamo utilizzare la costruzione con valore letterale "a[n] = {1,2,3}" 
 + int a[n];   
 + 
 + a[0] = 1;  
 + a[1] = 2;  
 + a[2] = 3; 
 + 
 + *c = a; 
 +
 + 
 +void array2(int ** c){ 
 + int n = 3; 
 + int a[n]; 
 + 
 + a[0] = 4; 
 + a[1] = 5; 
 + a[2] = 6; 
 + 
 + *c = a; 
 +
 +</code> 
 + 
 +Correggere il codice in modo che le funzioni array1() e array2() allochino i rispettivi array sullo heap con la funzione "malloc()", e venga quindi evitato l'effetto collaterale di B su A. 
 + 
 + 
 + 
 +===== Esercizio 6: Funzione di allocazione/deallocazione di matrici =====
  
 Le matrici possono essere rappresentate come array di puntatori a righe. Le matrici possono essere rappresentate come array di puntatori a righe.
fisica/informatica/201718/esercitazioni/esercitazione8.1519647099.txt.gz · Ultima modifica: 26/02/2018 alle 12:11 (7 anni fa) da Susanna Pelagatti

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki