Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    11

    [c] problema con array di stringhe dinamico

    Salve a tutti!
    Ho un problema con questo codice:

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define N 3
    #define MAX 2048

    int main(){
      
    char ** arrey;
      
    charstringa="prova";
      
    int i;
      
    arrey=(char**)malloc(N*sizeof(char*));
      
    arrey[0]=(char*)malloc(sizeof(stringa));
      
    strncpy(arrey[0],stringa,MAX);
      
    arrey[1]=(char*)malloc(sizeof("pino"));
      
    strncpy(arrey[1],"pino",MAX);
      
    arrey[2]=(char*)malloc(sizeof("\n"));
      
    strncpy(arrey[2],"\n",MAX);
      
    arrey[3]=(char*)malloc(sizeof("fuori"));
      
    strncpy(arrey[3],"fuori",MAX);
      
      for(
    i=0;i<N;i++)
        
    printf("%s\n",arrey[i]);

      
    fflush(stdout);

      
    arrey=realloc(arrey,sizeof(char*)+sizeof(arrey));

      
    arrey[4]=(char*)malloc(sizeof("NUOVO"));
      
    strncpy(arrey[4],"NUOVO",MAX);

      for(
    i=0;i<(N+1);i++)
        
    printf("%s\n",arrey[i]);

      return 
    0;

    in parole povere vorrei allocare dinamicamente un nuovo elemento nell'array "arrey" con la realloc, ma in esecuzione mi da un errore:

    *** glibc detected *** realloc(): invalid next size: 0x0804a008 ***
    Abort

    consigli?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Beh ... ci sono diversi errori "gravi" prima della realloc che pregiudicano il funzionamento del programma ...

    1) se allochi N puntatori devi usare gli elementi da 0 a N-1 ... quindi se allochi 3 puntatori, dovrai usare arrey[0], arrey[1] e arrey[2], mentre arrey[3] NON esistera' ... scrivendo in questo elemento, "sporcherai" la memoria contigua con effetti imprevedibili ...

    2) quando "misuri" lo spazio in caratteri occupato da una stringa devi farlo usando la funzione strlen e non la macro sizeof. La sizeof ti restituira' sempre la dimensione del dato passato che e' sempre un puntatore e quindi 4 byte.

    Dovrai inoltre prevedere lo spazio per il carattere terminatore (+1) e usare la strcpy e non la strncpy ... Dovrai quindi scrivere

    arrey[0]=(char*)malloc(strlen(stringa)+1);
    strcpy(arrey[0],stringa);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    ma se includi string.h per che usi un array di array di char? non puoi usare una array di string?

    string* array

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da Stoicenko
    string* array
    Il linguaggio usato e' il C ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    11
    Ho corretto il codice e cosi sembra funzionare:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define N 3
    #define MAX 2048
    
    
    int main(){
      char ** arrey;
      char* stringa="prova";
      int i;
      arrey=(char**)malloc(N*sizeof(char*));
      arrey[0]=(char*)malloc(strlen(stringa)+1);
      strcpy(arrey[0],stringa);
      arrey[1]=(char*)malloc(strlen("pino")+1);
      strcpy(arrey[1],"pino");
      arrey[2]=(char*)malloc(strlen("pluto")+1);
      strcpy(arrey[2],"pluto");
      
      for(i=0;i<N;i++)
        printf("%s\n",arrey[i]);
    
      fflush(stdout);
    
      arrey=(char**)realloc(arrey,sizeof(char*)*(N+1));
      arrey[3]=(char*)malloc(strlen("NUOVO")+1);
      strcpy(arrey[3],"NUOVO");
    
      for(i=0;i<(N+1);i++){
        printf("%s\n",arrey[i]);
        fflush(stdout);
      }
    
      return 0;
    }
    cosi dovrebbe essere corretto no? o funziona per grazia divina??? il c rimane un mistero per me... sob...

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    11
    Ho provato a fare una cosa diversa...

    Originariamente inviato da weo

    codice:
      arrey=(char**)realloc(arrey,sizeof(char*)*(N+1));
    al posto di quella riga ho provato con:

    codice:
      arrey=(char**)realloc(arrey, sizeof(char*)+sizeof(arrey));
    inoltre ho aggiunto delle istruzioni per liberare la memoria:

    codice:
      for(i=0;i<(N+1);i++)
        free(arrey[i]);
    
      free(arrey);
    
      printf("FINE!\n");
      fflush(stdout);
      fflush(stderr);
    Ma il risultato è:

    prova
    pino
    pluto
    prova
    pino
    pluto
    NUOVO
    *** glibc detected *** double free or corruption (out): 0x0804a018 ***
    Abort

    non funziona... perchè???

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.