C 如何检查动态分配
如何检查我在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
#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);
}