C memset正在清除它的内容';这是不应该的
我有一个服务器-客户端程序,可以添加或删除用户。当达到最大用户数(10)时,我在删除其中一个用户时出现错误 下面是删除用户的函数的一部分:C memset正在清除它的内容';这是不应该的,c,C,我有一个服务器-客户端程序,可以添加或删除用户。当达到最大用户数(10)时,我在删除其中一个用户时出现错误 下面是删除用户的函数的一部分: int i; int confirmacao = 0; msg_t msg; char cliname[10]; if (strlen(estrutura.id) == 3) { for (i = 0; memoria->x[i].id[0] != '\0'; ++i) { if (strcmp(estrutura.id, me
int i;
int confirmacao = 0;
msg_t msg;
char cliname[10];
if (strlen(estrutura.id) == 3) {
for (i = 0; memoria->x[i].id[0] != '\0'; ++i) {
if (strcmp(estrutura.id, memoria->x[i].id) == 0) {
confirmacao = 1;
for (; memoria->x[i].id[0] != '\0'; ++i) {
memoria->x[i] = memoria->x[i + 1];
}
// I think the problem is with this memset
memset(memoria->x[i].id, '\0', sizeof(memoria->x[i].id));
printf("IA antes de decrementar: %i\n", memoria->ia);
memoria->ia--;
printf("Ia depois: %i\n", memoria->ia);
break;
}
}
} else {
...
}
memoria->ia被设置为递减1,我可以理解为什么memset将其设置为零
memoria是此结构的全局指针:
typedef struct mmap_uti_s {
uti_t x[NUTI];
int ia;
} mmap_uti_t;
typedef struct uti_s {
char id[NDIG + 1];
char nome[NDIM + 1];
char portas[NPOR + 1];
} uti_t;
uti_t就是这种结构:
typedef struct mmap_uti_s {
uti_t x[NUTI];
int ia;
} mmap_uti_t;
typedef struct uti_s {
char id[NDIG + 1];
char nome[NDIM + 1];
char portas[NPOR + 1];
} uti_t;
复制上一个元素后,您无法重置最后一个元素,因为在测试数组结尾之前,您增加了
i
。此外,正如您正确指出的,必须始终在到达数组末尾之前停止复制
您应该将嵌套的for
循环中的测试更改为:
for (; i + 1 < 10 && memoria->x[i + 1].id[0] != '\0'; i++)
非常感谢你,我要花很长时间才能发现这一点!它是按照你说的方式工作的,但是在仔细考虑之后,如果我这样做,如果数组已满,在最后一个循环中它将执行
memoria->x[9]=memoria->x[10]代码>开关不存在。或者我的想法是错误的?我认为在for条件中应该是I+2
,然后在for条件中是I+1
memset@Sebastiao:您的推理是正确的,测试还应考虑最大有效偏移量。如果在memoria->x
中有10个条目,请将用于(;i<10-1&&memoria->x[i+1]。id[0]!='\0';i++)
@Sebastiao:for
循环的外部中缺少相同的测试。在完整表中搜索不存在的id
,将调用未定义的行为,因为您将继续扫描到数组末尾之外。我更新了答案。