空闲内存用于 return C 中的值

free memory used to return value in C

我有一个调用另一个函数的函数,该函数创建一个唯一 ID 并 returns 通过 malloc() 将其作为字符串。

我的问题是如何在函数外释放内存?或者做我想做的事情的更好方法是什么。

我的请求 ID 的函数:

void addCustomer(TennisStoreType* ts){

   CustomerNodePtr newcustdata;
   int datapos = 0;

   newcustdata = malloc(sizeof(CustomerNodeType));

   while (datapos <= CUSTDATA_POSITIONS) {

      char userinput[BUFFER_SIZE];

      switch (datapos) {
         case 0:
            strcpy(newcustdata->custID, createCustID(ts));
            break;
   }
}

函数returns uniqueID:

char* createCustID(TennisStoreType* ts) {

   char *custID;

   custID = (char *)malloc(CUSTID_LEN + 1 * sizeof(char));

   if (ts->customerCount + 1 >= FOURDIGITS) {
      sprintf(custID, "C%i\n", ts->customerCount + 1);

   } else if (ts->customerCount + 1 >= THREEDIGITS){
      sprintf(custID, "C0%i\n", ts->customerCount + 1);

   } else if (ts->customerCount + 1 >= TWODIGITS) {
      sprintf(custID, "C00%i\n", ts->customerCount + 1);

   } else {
      sprintf(custID, "C000%i\n", ts->customerCount + 1);
   }

   return custID;
}

那么我将如何释放已复制到 newcustdata->custID 的字符串?我什至需要吗?还是有更好的方法来做到这一点?

提前致谢。

您的 createCustID() 函数将分配一些内存,然后 return 通过 return 从 malloc() 获得的指针将其分配给调用者。

调用例程在完成结构后,可以(并且必须)通过将相同的指针传递给 free() 来释放内存。

在您的示例中,您需要扩展 addCustomer() 中的逻辑,以保留它从 createCustID() 接收到的指针足够长的时间,以便 (1) 测试它不为空,(2) 如果存在,则将内容复制到本地需要,并且 (3) 释放接收到的块。

正如其他人所指出的,您可能会发现将接收到的块构建到您正在组装的数据结构中比复制它更有效。但是,作为处理更大数据结构的逻辑的一部分,您仍然需要释放该块。

您需要仔细规划此类代码的代码路径,以便您始终知道谁 "owns" 分配了块,并负责在不再需要时释放它。

此外,您必须始终 检查 malloc() 的 return 值是否为 null。如果 malloc 未能给你你要求的内存,你需要适当地处理这个错误;而不是一味的往空指针中写入数据。

您可以完全取消该功能。行

strcpy(newcustdata->custID, createCustID(ts));

可以简单地写成

sprintf( newcustdata->custID, "C%04d", ts->customerCount + 1 );

当然前提是custID是至少6个字符的数组,例如

char custID[8];

备注:

  1. 我通常将 char 数组大小四舍五入到 8 的倍数,因为结构 填充无论如何都会浪费字节。
  2. 我删除了 \n 因为换行似乎不对 字符在一个唯一的 ID 中,当然你可以把它加回去。

如果你真的很喜欢那个功能,想保留它,那就替换

switch (datapos) {
   case 0:
      strcpy(newcustdata->custID, createCustID(ts));
      break;
}

有了这个

char *temp;
switch (datapos) {
   case 0:
      temp = createCustID(ts);
      strcpy(newcustdata->custID, temp);
      free( temp );
      break;
}

这将在复制后释放内存。