复用char * 指针需要free 和malloc 吗?

Reuse char * pointer needs to free and malloc again?

我想实现一个主要功能,例如为了执行系统命令。当前使用以下代码:

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

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

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

如果您使用通用函数来执行 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;
}