C 如何检查动态分配

C 如何检查动态分配,c,unix,fork,dynamic-allocation,C,Unix,Fork,Dynamic Allocation,如何检查我在C代码中是否正确使用了动态分配。 这是大学的任务。当我把我的代码放入我教授的自动纠错系统时,我得到了一个动态分配的错误。我的代码: #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <stdarg.h> #include <sys/type

如何检查我在C代码中是否正确使用了动态分配。 这是大学的任务。当我把我的代码放入我教授的自动纠错系统时,我得到了一个动态分配的错误。我的代码:

#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);

        }

    }
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
对于(;;)
{
char*cmd,*splitcmd;
//*pr0、*pr1、*pr2;
尺寸=1024;
字符pr1[bufsize];
字符pr2[bufsize];
字符pr0[bufsize];
//char-pr3[40];
int i,j,nargc=0,字符;
字符数组;
//尺寸=1024;
//尺寸_tbufsizecmd=1024;
pid_t pid,wpid;
int status=0;
字符pr='$';
char exit1[10]=“退出”;
字符*路径;
path=getenv(“path”);
putchar(pr);
cmd=malloc(bufsize*sizeof*cmd);
characters=getline(&cmd,&bufsize,stdin);
//printf(“cmd==>%s字符===>%d\n”,cmd,字符);
如果(cmd[characters-1]=='\n')
{
cmd[characters-1]='\0';
字符--;
}
//printf(“cmd==>%s字符===>%d\n”,cmd,字符);
cmdArray=malloc(bufsize*sizeof*cmdArray);
对于(i=0;i//printf(“------------>Eksodos apo to programma对于
cmd=(char*)malloc(bufsize*sizeof(char));

此外,此代码块:

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

在此代码块中,有两个
exit()
调用:

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如果(nargc==2)
{
strcpy(pr0,cmdArray[0]);
strcpy(pr1,cmdArray[1]);
char*argv[]={pr0,pr1,NULL};
execvp(pr0,argv);
出口(0);
对于(i=0;i

紧跟在
execvp(pr0,argv)之后的那一个;
阻止执行任何
free()
调用。它需要被删除。

在C中,不强制转换malloc。使用mtrace()跟踪内存分配和释放。这里有一个很好的教程-我编辑我的代码。但我还是得到了同样的信息。我做得对吗?@coderdoc我不知道。当我问他时,他告诉我问题是我的代码没有在内存中进行动态分配。@coderdoc谢谢你的帮助。但仍然是同样的错误信息。
free(cmd);
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);
}