Visualizzazione dei risultati da 1 a 10 su 18

Visualizzazione discussione

  1. #9
    Quote Originariamente inviata da BoG Visualizza il messaggio
    faccendolo eseguire, noto che
    codice:
    vet[-1]=0
    ..?? non dovrebbe esserci memoria sporca?
    Per quanto concerne lo standard C++, stai sforando da un array, per cui si cade nell'"undefined behavior" - qualunque comportamento è lecito.

    Quello che in pratica accade è che sforando in negativo da un array stai andando a pescare valori in zone più alte dello stack (su architettura x86 lo stack cresce verso indirizzi più bassi), che a questo punto del programma probabilmente non sono ancora state toccate.
    Queste pagine di memoria partono in genere piene di zeri perché su praticamente ogni sistema operativo moderno le pagine di memoria "nuove" che vengono fornite ad un processo sono "bianche" (ovvero riempite di zeri), per evitare che un processo possa vedere dati riservati da pagine di memoria deallocate da altri processi.

    Va detto che diversi compilatori in modalità "debug" (nonché il "debug allocator" dell'heap manager di Windows) riempiono la memoria non inizializzata (su stack ed heap) di "valori sentinella" (va spesso per la maggiore 0xcc o 0xcd), in modo da consentire di individuare problemi di uso di memoria non inizializzata.
    Poi vorrei fare un altra domanda:
    come potete vedere, nell'esercizio, passo un vettore di dimensione 5 ad un vettore di dimensione 7. Ok, immagino che compilera' i 5 campi con i valori passatigli e gli altri rimaranno memoria sporca. Ma se io passassi il mio vettore di 5 elementi ad uno di 2? i primi 2 come funzionerebbe?
    Qui è la sintassi C che confonde. Quando in una dichiarazione di funzione tu scrivi
    codice:
    void funzione(int arr[50]);
    di fatto viene parsato come
    codice:
    void funzione(int arr[]);
    ovvero
    codice:
    void funzione(int *arr);
    Questo segue dal fatto che, per una serie di accidenti storici, in C gli array (1) non si possono passare per valore e (2) decadono facilmente in puntatori al primo elemento. In effetti, personalmente ritengo che sia buona norma semplicemente non specificare le dimensioni degli array passati come parametri a funzione, visto che sono sempre e comunque puntatori e scrivere delle dimensioni serve solo a confondere i principianti.

    (tieni conto comunque che questo vale solo per i parametri delle funzioni, se in una struct o da qualunque altra parte scrivi int arr[50]; stai effettivamente dichiarando un array di 50 interi)
    se io so che dentro ci sono 5 elementi, io posso scrivere vettore[5] anche se il vettre è stato dichiarato ti dimensione 1. Giusto?
    Sì ma questo è un artefatto di quanto appena detto, ovvero segue dal fatto che, se è un parametro ad una funzione, di fatto è un puntatore. Ovviamente se fai vettore[5] su un vettore che è stato effettivamente dichiarato come di 1 elemento vai in undefined behavior.
    Ultima modifica di MItaly; 21-12-2013 a 18:54
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.