2015-11-27 5 views
1

Comment puis-je vérifier si j'utilise correctement l'allocation dynamique dans mon code C. C'est une affectation pour uni. Quand je mets mon code dans le système de correction automatique de mon professeur, j'obtiens une erreur pour l'allocation dynamique. Mon code:Comment vérifier l'allocation dynamique

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <stdarg.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <ctype.h> 
int main() 
{ 

    for(;;) 
    { 
     char *cmd,*splitcmd; 
//*pr0,*pr1,*pr2 ; 
    size_t bufsize = 1024; 
     char pr1[bufsize]; 
     char pr2[bufsize]; 
     char pr0[bufsize]; 
     //char pr3[40]; 
     int i,j,nargc=0,characters; 
     char **cmdArray; 
     //size_t bufsize = 1024; 
     // size_t bufsizecmd =1024; 
     pid_t pid,wpid; 
     int status = 0; 
     char pr='$'; 
     char exit1[10]="exit"; 
     char *path; 
     path = getenv("PATH"); 

     putchar(pr); 


     cmd = malloc(bufsize * sizeof*cmd); 
     characters = getline(&cmd,&bufsize,stdin); 
//printf("cmd===> %s characters===> %d \n",cmd,characters); 
     if(cmd[characters-1]=='\n') 
     { 
      cmd[characters-1]='\0'; 
      characters--; 
     } 
//printf("cmd===> %s characters===> %d \n",cmd,characters); 


     cmdArray = malloc(bufsize*sizeof*cmdArray); 
     for (i = 0; i < bufsize; i++) 
     { 
      cmdArray[i]=malloc(bufsize*sizeof*cmdArray); 
     } 

     splitcmd=strtok(cmd," "); 
     // printf(" cmd==== %s\n",cmd); 
     while((splitcmd)) 
     { 
      strcpy(cmdArray[nargc],splitcmd); 
      if(cmdArray[nargc][(strlen(cmdArray[nargc]))-1]==' ') 
       cmdArray[nargc][(strlen(cmdArray[nargc]))-1]='\0'; 
//printf(" nargc====%d cmdArray===[%s] \n",nargc,cmdArray[nargc]); 
      nargc++; 
      splitcmd = strtok(NULL," "); 
     } 


//printf(" pr0 %s \n",pr0); 
//printf(" pr1 %s \n",pr1); 
//printf(" pr2 %s \n",pr2); 

     strcpy(pr0,cmdArray[0]); 
     if (strcmp(pr0, exit1) == 0) 
     { 
      //printf("---------->Eksodos apo to programma<---------- \n"); 
     free(cmd); 
      return (0); 
      exit(0); 

      //return (0); 
     } 
     else 
     { 


      if ((pid=fork()) == 0) 
      { 
       if(nargc ==1) 
       { 
        strcpy(pr0,cmdArray[0]); 
        char *argv[] = {path,NULL}; 

        execvp(pr0,argv); 

        for (i = 0; i < bufsize; i++) 
        { 
         free(cmdArray[i]); 
        } 
        free(cmdArray); 
      free(cmd); 
        exit(0); 
       } 
       else if(nargc==2) 
       { 
        strcpy(pr0,cmdArray[0]); 
        strcpy(pr1,cmdArray[1]); 
        char *argv[] = {pr0,pr1,NULL}; 

        execvp(pr0,argv); 
        exit(0); 

        for (i = 0; i < bufsize; i++) 
        { 
         free(cmdArray[i]); 
        } 
        free(cmdArray); 
      free(cmd); 
        exit(0); 
       } 
       else 
       { 

        strcpy(pr0,cmdArray[0]); 
        strcpy(pr1,cmdArray[1]); 
        strcpy(pr2,cmdArray[2]); 

        //printf("cmdddddddd****====%s \n",*cmdArray); 
        char *argv[] = {pr0,pr1,pr2,NULL}; 

        execvp(argv[0],argv); 

        for (i = 0; i < bufsize; i++) 
        { 
         free(cmdArray[i]); 
        } 
        free(cmdArray); 
      free(cmd); 
        exit(0); 
       } 
      } 

      wait(&status); 

     } 

    } 
} 
+3

En C, vous ne lancez pas de malloc. http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – meskobalazs

+0

Tracez l'allocation de mémoire et libérez en utilisant mtrace (http://www.gnu.org/software/libc/manual /html_node/Tracing-malloc.html#Tracing-malloc). Il y a un bon tutoriel ici - http://man7.org/linux/man-pages/man3/mtrace.3.html – Kishore

+0

Je modifie mon code. Mais je reçois toujours le même message. Est-ce que je le fais bien? @coderredoc –

Répondre

1

Il n'y a pas libre() correspondant pour cmd = (char *)malloc(bufsize * sizeof(char));.

En outre, ce bloc de code:

strcpy(pr0,cmdArray[0]); 
if (strcmp(pr0, exit1) == 0) 
{ 
    //printf("---------->Eksodos apo to programma<---------- \n"); 
free(cmd); 
    return (0); 
    exit(0); 
    //return (0); 
} 

aura besoin de cette

for (i = 0; i < bufsize; i++) 
{ 
    free(cmdArray[i]); 
} 
free(cmdArray); 

avant la

free(cmd); 

Dans ce bloc de code, il y a deux exit() appels:

else if(nargc==2) 
{ 
    strcpy(pr0,cmdArray[0]); 
    strcpy(pr1,cmdArray[1]); 
    char *argv[] = {pr0,pr1,NULL}; 

    execvp(pr0,argv); 
    exit(0); 

    for (i = 0; i < bufsize; i++) 
    { 
     free(cmdArray[i]); 
    } 
    free(cmdArray); 
free(cmd); 
    exit(0); 
} 

L'un immédiatement après l'execvp(pr0,argv); empêche l'un des appels free() d'être exécutés. Il doit être retiré.

+0

Merci pour l'aide. Mais toujours le même message d'erreur. –