我总体上是编程初学者,我关心内存分配。在此函数中,我为结构中的字符串动态分配内存,然后将此结构传递给数组。
我相信两个内存位置是相同的,但我想与比我更有经验的人确认。
如果用户决定不添加该项目,我会释放内存,但一旦确认,该结构就会传递到数组,然后由于堆栈的工作方式,它会被“销毁”。但是,如果内存地址不同,我将拥有永远不会释放的内存,我知道这不好。
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++;
}
}
当你传递一个结构体时,它是按值传递的,因此被复制。它的所有成员也被复制。但是,如果其中之一是指针,则复制的指针仍然保留相同的内存地址。
+----------+
| struct A | +-----------+
| char *s ---------->| "Hello" |
+----------+ +-----------+
^
/
+-----------+ /
| copy of A | /
| char *s-----------
+-----------+