这种情况下是否将相同的内存地址复制到了main函数中?

问题描述 投票:0回答:1

我总体上是编程初学者,我关心内存分配。在此函数中,我为结构中的字符串动态分配内存,然后将此结构传递给数组。

我相信两个内存位置是相同的,但我想与比我更有经验的人确认。

如果用户决定不添加该项目,我会释放内存,但一旦确认,该结构就会传递到数组,然后由于堆栈的工作方式,它会被“销毁”。但是,如果内存地址不同,我将拥有永远不会释放的内存,我知道这不好。

void addShopItem(ShopItem *shoppingList, int shopListIndex)
{
  ShopItem ListItem;
  char itemName[MAXSTR];

  // Asking the user for input
  printf("Item %d: ", shopListIndex + 1);
  fgets(itemName, MAXSTR, stdin);
  itemName[strlen(itemName) - 1] = '\0';

  // Some code goes here

  ListItem.name = malloc(strlen(itemName) + 1);

  if (ListItem.name == NULL)
  {
    fprintf(stderr, "Error. Memory not allocated");
    exit(1);
  }

  strcpy(ListItem.name, itemName);

  // This is the part that concerns me
  if (confirmItemToList(&ListItem) == false)
  {
    free(ListItem.name);
    return addShopItem(shoppingList, shopListIndex);
  }
  else
  {
    shoppingList[shopListIndex] = ListItem;
  }
  return;
}

// I was using this function to later free the memory in all the structs in the array
void freeMemoryAndReset(ShopItem *shoppingList)
{
  int i = 0;
  while (i < MAXITEMS && shoppingList[i].name != NULL)
  {
    free(shoppingList[i].name);
    shoppingList[i].amount = 0;
    i++;
  }
}
c memory dynamic-memory-allocation
1个回答
0
投票

当你传递一个结构体时,它是按值传递的,因此被复制。它的所有成员也被复制。但是,如果其中之一是指针,则复制的指针仍然保留相同的内存地址。

+----------+
| struct A |          +-----------+
| char *s  ---------->| "Hello"   |
+----------+          +-----------+
                       ^
                      /
+-----------+        /
| copy of A |       /
| char *s-----------  
+-----------+
© www.soinside.com 2019 - 2024. All rights reserved.