Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    4

    Allocazione dinamica di un array in una procedura

    Ciao,
    di seguito parte del codice che mi sta facendo impazzire, non sono un super esperto di C.

    main(){
    int grade;
    int *coeff;
    coeff = (int *)malloc(sizeof(int));
    .........
    grade = enterCoeff(coeff);

    dove la subroutine e':
    int enterCoeff(int *poliCoeff){
    int i =0;
    while( ......){
    i++;
    poliCoeff=(int *)realloc(poliCoeff, sizeof(int)*(i+2));
    ......;
    }
    return(i);
    }

    In pratica alloco un array di un elemento nel main, e dinamicamente incremento la dimensione dell'array nella subroutine. Mi aspetto che all'uscita dalla subroutine il puntatore *coeff sia aggiornato all'indirizzo dell'array reallocato, ovvero che l'indirizzo di poliCoeff[0] al termine della procedura enterCoeff coincida con l'indirizzo di coeff[0] nel programma principale dopo l'esecuzione della subroutine.
    Questo non avviene, e lo vedo facilmente inserendo un paio di printf nel main e nella subroutine. Sapete aiutarmi a capire dove sbaglio? Sto facendo un errore concettuale o di sintassi?
    Grazie ......

  2. #2
    L'errore è concettuale. Se vuoi che anche coeff si aggiorni dovrai passare un puntatore a coeff (e quindi un int **, un puntatore a un puntatore a int) perché la subroutine lo possa modificare. In ogni caso la prima allocazione di coeff sembrerebbe inutile (tanto poi ci pensa il realloc ad allocare la memoria che serve per davvero, se non usi coeff prima che in enterCoeff limitati ad inizializzarla a NULL), mentre la continua riallocazione dell'array può condurre a problemi di performance.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    4
    Grazie, credo di cominciare a capire .....

  4. #4
    Prego; se hai altri dubbi non esitare a chiedere.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    La prossima volta usi i tag CODE ed indenta per favore

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 © 2024 vBulletin Solutions, Inc. All rights reserved.