【发布时间】:2021-07-22 08:58:31
【问题描述】:
所以我有这个 Contact 结构和一个包含一堆 Contact 实例的数组。我的问题是我使用 memcpy 并尝试使用 mmove 为此数组“删除”和“添加”联系人元素。当我调试和运行程序时,它似乎工作得很好。我可以跟踪从数组中添加和删除的联系人,但是当我运行程序时没有调试并且没有单步执行程序崩溃!
这是我的联系人结构:
typedef struct contact Contact;
typedef struct contact *pContact;
struct contact {
char lastName[BUFSIZ];
char firstName[BUFSIZ];
char email[BUFSIZ];
char pNumber[BUFSIZ];
};
这是创建联系人的方式:
struct Contact *contactArr[1024];
int size = 0;
Contact* CreateContact(int pos, char *info) {
Contact *pContactNewContact = (Contact*) malloc(sizeof(Contact));
char *lastName = strtok(info, ",");
char *firstName = strtok(NULL, ",");
char *email = strtok(NULL, ",");
char *pNumber = strtok(NULL, ",");
if (pContactNewContact) {
strcpy(pContactNewContact->lastName, lastName);
strcpy(pContactNewContact->firstName, firstName);
strcpy(pContactNewContact->email, email);
strcpy(pContactNewContact->pNumber, pNumber);
}
InsertContact(pos, pContactNewContact);
return pContactNewContact;
}
这些是我的数组操作函数。
void InsertContact(int pos, pContact *insert) {
if (size == 0)
contactArr[0] = insert;
else {
memmove((contactArr + pos + 1), (contactArr + pos),
(size + 1) * sizeof(Contact));
contactArr[pos] = insert;
}
size++;
}
void DelContact(int pos) {
if (pos == 0) {
memmove(contactArr, (contactArr + 1), (size - 1) * sizeof(Contact));
contactArr[pos] = 0;
} else if (pos <= size) {
memmove((contactArr + pos - 1), (contactArr + pos),
(size - pos) * sizeof(Contact));
contactArr[pos] = 0;
}
size--;
}
【问题讨论】:
-
代码太不完整。请提供complete minimal reproducible example。但当然
memcpy不应该用于重叠src 和dest。当您使用完整的最小代码更新帖子时,显示memove版本。 -
如果源和目标重叠,则不能使用
memcpy()。你必须使用memmove() -
没错,这就是我从类似帖子中收集到的内容,尽管即使使用 memmove() 也存在同样的问题。尽管我将取消 memcpy(),但我很感激您的意见。
-
我认为您的计算中有一些错误。如果你写
&contactArr[pos]而不是使用指针算法会更容易。 -
为什么在移动数组元素后分配 0?您正在删除替换已删除联系人的联系人。