memset清除它不应该的东西

时间:2016-12-10 18:27:27

标签: 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, 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 {
    ...
}

Here is the print from gdb

memoria-> ia被称为减1,我可以弄清楚为什么memset将其设置为零。

memoria是这种结构的全局指针:

typedef struct mmap_uti_s {
    uti_t x[NUTI];
    int ia;
} mmap_uti_t;

和uti_t就是这个结构:

typedef struct uti_s {
    char id[NDIG + 1];
    char nome[NDIM + 1];
    char portas[NPOR + 1];
} uti_t;

1 个答案:

答案 0 :(得分:1)

复制上一个元素后,您无法重置最后一个元素,因为在测试数组末尾之前增加i。此外,正如您所正确指出的那样,您必须始终在到达阵列末尾之前停止复制。

您应该将嵌套for循环中的测试更改为:

for (; i + 1 < 10 && memoria->x[i + 1].id[0] != '\0'; i++)

您还应该更改主循环中的测试,以便在数组末尾的扫描结束时停止扫描。

虽然不是绝对必要,但在复制阶段使用不同的索引会更好,以避免修改当前循环的索引。

清除整个结构,而不仅仅是id成员,似乎也是可取的。

以下是修改后的代码:

int i, j;
int confirmacao = 0;
msg_t msg;
char cliname[10];
if (strlen(estrutura.id) == 3) {
    for (i = 0; i < 10 && memoria->x[i].id[0] != '\0'; ++i) {
        if (strcmp(estrutura.id, memoria->x[i].id) == 0) {
            confirmacao = 1;
            for (j = i; j + 1 < 10 && memoria->x[j].id[0] != '\0'; ++j) {
                memoria->x[j] = memoria->x[j + 1];
            }
            // I think the problem is with this memset
            memset(&memoria->x[j], 0, sizeof(memoria->x[j]));
            printf("IA antes de decrementar: %i\n", memoria->ia);
            memoria->ia--;
            printf("Ia depois: %i\n", memoria->ia);
            break;
        }
    }
} else {
    ...
}