C memset正在清除它的内容';这是不应该的

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

我有一个服务器-客户端程序,可以添加或删除用户。当达到最大用户数(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, 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
,将调用未定义的行为,因为您将继续扫描到数组末尾之外。我更新了答案。