用于返回C中值的可用内存



我有一个函数调用另一个函数,该函数创建一个唯一的ID,并通过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;
   }
}

返回uniqueID:的函数

char* createCustID(TennisStoreType* ts) {
   char *custID;
   custID = (char *)malloc(CUSTID_LEN + 1 * sizeof(char));
   if (ts->customerCount + 1 >= FOURDIGITS) {
      sprintf(custID, "C%in", ts->customerCount + 1);
   } else if (ts->customerCount + 1 >= THREEDIGITS){
      sprintf(custID, "C0%in", ts->customerCount + 1);
   } else if (ts->customerCount + 1 >= TWODIGITS) {
      sprintf(custID, "C00%in", ts->customerCount + 1);
   } else {
      sprintf(custID, "C000%in", ts->customerCount + 1);
   }
   return custID;
}

那么,我该如何释放已复制到newcustdata->custID的字符串呢?我需要吗?或者有更好的方法吗?

提前谢谢。

您可以完全消除该函数。线路

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

可以简单地写为

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

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

char custID[8];

注:

  1. 我通常将char阵列大小舍入为8的倍数,因为结构无论如何,填充都会浪费字节
  2. 我删除了n,因为它似乎没有换行符字符,但您当然可以将其添加回中

如果你真的喜欢这个功能,并想保留它,那么就更换

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;
}

这将在复制后释放内存。

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

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

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

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

您需要使用这种类型的代码仔细规划代码路径,这样您就可以始终知道谁"拥有"分配的块,并负责在不再需要时释放它。

此外,您必须始终检查malloc()的返回值是否为null。如果malloc没有给您所需的内存,您需要适当地处理错误;而不仅仅是将数据写入空指针。

相关内容

  • 没有找到相关文章

最新更新