2017-04-25 3 views
-2

J'essaie d'entrer un caractère à la fois pour chaque bloc par ligne, mais ce qui se passe est que la dernière ligne écrasera le contenu précédent que j'ai stocké dans la rangée précédente. En fin de compte, toutes mes lignes ont le même contenu .. Quelqu'un peut-il expliquer ce que je fais mal?Pourquoi mon double pointeur écrase-t-il ses lignes?

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

int main() 
{ 
    int row=0,col=0,i; 
    char c; 
    char **this=NULL; 

    this=calloc(64,sizeof(char*)); 


    for(i=0;i<64;++i) 
    { 
     this[i]=calloc(5,sizeof(char)); 
     free(this[i]); 
    } 

    while(c!=EOF) 
    { 
     c=getchar(); 
     if(!isspace(c)&&isprint(c)) 
     { 
      if(c==',') 
      { 
       this[row][col]='\0'; 
       row++; 
       col=0; 
      } 
      else if(c=='.') 
      { 
       this[row][col]=c; 
       this[row][col+1]='\0'; 
      } 
      else 
      { 
      this[row][col]=c; 
      //printf("%d,%d\n",row, col); 
      //printf("%c\n",this[row][col]); 
      //printf("%s\n",this[row]); 
      //printf("%s\n",this[row+1]); 
      col++; 
      } 
     } 
    } 
    printf("string0:%s\n",this[0]);//prints the same thing 
    printf("string1:%s\n",this[1]); 

    free(this); 
    return 0; 
} 
+2

Qu'est-ce qui se passe avec le 'free (this [i])' après l'allocation? Votre utilisation de l'un des pointeurs après cela est un comportement indéfini. –

+0

Je sais que chaque fois que je l'alloue, je dois le libérer afin que je puisse toujours réutiliser l'espace? mais je ne sais pas vraiment où je devrais le libérer. –

+0

Vous libérez la mémoire quand vous avez fini avec elle. Si vous essayez d'utiliser la mémoire allouée (et l'objet pointeur aussi) après libre, c'est un comportement indéfini. –

Répondre

2

Dans votre code, après calloc() -ing, vous immédiatement faire

free(this[i]); 

rendant la mémoire à marquer comme libéré (à savoir, ne pas utiliser plus). Ensuite, plus tard, vous essayez d'utiliser la mémoire, il provoque undefined behavior.

Vous devez libérer la mémoire une fois que vous avez fini de l'utiliser. Un bon moment pour appeler free() sur personne this[i] sera juste avant le

free(this); 

appel.

+0

ohhhh tyty son fixedd! –