重用char*指针需要再次释放和malloc



我想实现一个主函数,例如,以便执行系统命令。当前使用以下代码:

int main(int argc, char *argv[])
{
   size_t cmd_length;
   char *cmd_buffer = NULL; 
   char *file = NULL;
   char *ip = NULL;
   int size;
   if(argc == 3)
   {
       size = strlen(argv[1]);
       file = (char*)malloc((size + 1)*sizeof(char));
       strcpy(file, argv[1]);       
       size = strlen(argv[2]);
       ip = (char*)malloc((size + 1)*sizeof(char));     
       strcpy(ip, argv[2]);     
   }
   cmd_length = snprintf(NULL, 0, "tftp -g -r %s %s", file, ip);
   cmd_buffer = malloc(cmd_length + 1);
   if (cmd_buffer == NULL) 
   {
       return -1; 
   }
   snprintf(cmd_buffer, cmd_length + 1, "tftp -g -r %s %s", file, ip);
   if(system(cmd_buffer) == 0) 
   {
      then ...
   }
   {
      return -1;
   }
   free(cmd_buffer);
   cmd_buffer = NULL;
   cmd_length = snprintf(NULL, 0, "tftp -g -r %s %s", DFT_FILE, DFT_IP);
   cmd_buffer = malloc(cmd_length + 1);
   if (cmd_buffer == NULL) 
   {
       return -1; 
   }
   snprintf(cmd_buffer, cmd_length + 1, "tftp -g -r %s %s", DFT_FILE, DFT_IP);
   if(system(cmd_buffer) == 0) 
   {
      then ...
   }
   {
      return -1;
   }
   free(cmd_buffer);
   free(file);
   free(ip);
   cmd_buffer = NULL;
   file = NULL;
   ip = NULL;
   return 0;
}

因为我需要输入其他命令,所以在重新分配内存之前,我使用free()来使用相同的cmd_buffer。这样做对吗?将来可能需要一些其他命令。

如果您使用一个通用函数来执行system调用,您的程序可以大大简化。它甚至根本不需要使用malloc。以下是部分实现[请原谅免费的样式清理]:

#include <stdarg.h>
int
execute_command(const char *fmt,...)
{
    char cmd_buffer[5000];
    int cmd_length;
    va_list ap;
    // NOTE: much simpler to used a fixed size buffer that is larger than
    // needed
    va_start(ap,fmt);
    cmd_length = vsnprintf(cmd_buffer,sizeof(cmd_buffer),fmt,ap);
    va_end(ap);
    if (system(cmd_buffer) != 0)
        return -1;
    return 0;
}
int
main(int argc, char *argv[])
{
    char *file = NULL;
    char *ip = NULL;
    // NOTE: I had to guess the intent if fewer arguments are passed (e.g. just
    // skip as I did here, print message and abort?)
    if (argc == 3) {
        // NOTE: no need to malloc these, but if you did, see strdup(3)
        file = argv[1];
        ip = argv[2];
        execute_command("tftp -g -r %s %s", file, ip);
    }
    execute_command("tftp -g -r %s %s", DFT_FILE, DFT_IP);
    return 0;
}

是的,您实际上只是在重新使用指针变量cmd_buffer,这很好。并且对于每个malloc()都有一个匹配的free(),这是好的。

您应该将我们的公共代码分解为一个函数,例如runCommand(const char *command, ...)(使用varargs)。

相关内容

  • 没有找到相关文章

最新更新