重用char *指针需要再次free和malloc吗?

时间:2015-12-21 22:50:02

标签: linux malloc free realloc

我想实现一个main函数,例如为了执行系统命令。目前使用以下代码:

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。这是正确的方法吗?将来可能还需要一些其他命令。

2 个答案:

答案 0 :(得分:0)

是的,你基本上只是重复使用指针变量cmd_buffer,这很好。对于每个malloc(),都有匹配的free(),这很好。

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

答案 1 :(得分:0)

如果使用通用功能执行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;
}