gpt4 book ai didi

c - 从动态指针数组中删除位置 - 字节丢失 - c

转载 作者:行者123 更新时间:2023-11-30 16:23:17 28 4
gpt4 key购买 nike

每次删除数组中的位置时,我都会丢失字节。我第一次这样做: ///*mens[index] = mens[index + 1];*/但它丢失了更多字节。希望得到您的帮助!!

user_** deleteMen(user_** mens,int* numMens, int index)
{

int f;
if (index >=(*numMens))
{
printf("Error\n");
return mens;
}
//free the index string
free(mens[index]->userName);
free(mens[index]->description);
free(mens[index]->password);
free(mens[index]->name);
free(mens[index]->lastName);
free(mens[index]->userId);
for (f = index; f < *numMens - 1; f++)
{
mens[f]->age = mens[f + 1]->age;
mens[f]->description = mens[f + 1]->description;
mens[f]->gender = mens[f + 1]->gender;
mens[f]->hobbies = mens[f+ 1]->hobbies;
mens[f]->lastName = mens[f + 1]->lastName;
mens[f]->name = mens[f + 1]->name;
mens[f]->password = mens[f + 1]->password;
mens[f]->userId = mens[f + 1]->userId;
mens[f]->userName = mens[f + 1]->userName;
}
free(mens[*numMens - 1]->description);
free(mens[*numMens - 1]->lastName);
free(mens[*numMens - 1]->name);
free(mens[*numMens - 1]->password);
free(mens[*numMens - 1]->userId);
free(mens[*numMens - 1]->userName);
free(mens[*numMens - 1]);
mens= (user_**)realloc(mens, (*numMens-1) * sizeof(user_*));
if (mens == NULL)
if (*numMens != 1)
exit(1);
*numMens-=1;
return mens;
}

最佳答案

首先:您使用signed int 作为索引和数字。那么输入可能为负数(!),因此您必须进行检查。如果您使用无符号类型(特别是负索引和数组长度无论如何都是毫无意义的),则可以避免此问题。我个人会使用 size_t

稍微缩短了您的代码:

free(mens[index]->userName);
// ...
for (f = index; f < *numMens - 1; f++)
{
mens[f]->age = mens[f + 1]->age;
// ...
}

// these are wrong: you moved them to preceeding list element already
// (unless it was the last element itself, but then you freed them directly
// before entering the loop)
free(mens[*numMens - 1]->description);

// but I assume you instead want to delete the last element instead:

free(mens[*numMens - 1]);

不过,您可以更轻松地完成这部分:

free(mens[index]->userName);
// ...

free(mens[index]);

for (f = index; f < *numMens - 1; f++)
{
mens[f] = mens[f + 1];
}

不过,重新分配部分是有问题的:

  1. 传递零大小的结果是 implementation defined – 你可能会或不会得到一个空指针,内存可能会或不会被释放。
  2. 自 C11 起,已弃用对零大小的支持。

减少内存大小可能会迫使函数的用户在向数组添加另一个元素后立即进行新的realloc,这可能对她/他不利......

我个人的建议:

typedef struct
{
size_t size;
size_t capacity;
user_** data; // maybe even better: user_* data??? - depends on use case, though
} List;

该结构将所有相关数据保存在一个位置,如果您将其用于插入/删除功能,效果会更好。如果容量不足,您可以增加内存,但将减少量留给用户(不过,为了方便起见,可能有一个单独的功能)。

如果您觉得想起了 C++:是的,基本思想是从那里窃取的 (std::vector)...

关于c - 从动态指针数组中删除位置 - 字节丢失 - c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54035134/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com