排队功能仅在第二次迭代时覆盖第一个条目

时间:2015-11-15 06:37:39

标签: c queue

我确信我在这里错过了一个小细节,但我似乎无法将手指放在上面。如果你能指出我正确的方向,我会非常感激。我有一个用C编写的非常简单的入队函数:

int enqueue(char **queue, char *new_item) {

    if (queueLength >= MAX_ITEMS) {
        perror("Item count exceeds allowed range\n");
        return 1;
    }

    else {
        if (queueStart == -1) { // empty queue
            queueStart = 0;
            queueEnd = 0;
        }
        else {
            if (queueEnd == MAX_ITEMS - 1)
                queueEnd = 0;
            else queueEnd++;
        }

        // if queue[queueEnd] has not been initialized, allocate memory to initialize
        if (queue[queueEnd] == NULL) {

            if ((queue[queueEnd] = (char *)malloc(PATH_MAX * sizeof(char))) == NULL) {
                perror("Could not allocate enough space for data");
                return 1;
            }
        }

        strcpy(queue[queueEnd], new_item);

        queueLength++;
    }

    // print queue
    int j = queueStart;
    while (j <= queueEnd) {
        printf("%s\n", queue[j]);
        j++;
    }
    printf("-----\n");

    return 0;
}

在调用一次以将一个项目添加到我的队列后,我的队列如下所示:

item1

第二次调用它后,我的队列看起来像这样:

item2
item2

第三次,第四次和第五次之后:

item2
item2
item3
item4
item5

因此问题被隔离到第二次迭代。欢迎任何有用的观察,想法或评论!

此外,这是一个调用enqueue的代码片段。 inputFile是一个打开的文件流。

char **queue;
char buff[PATH_MAX];
while (fgets(buff, PATH_MAX, inputFile) != NULL) {

    if (enqueue(queue, buff)) {
        printf("Failed to add client %s to queue", buff);
        return 1;
    }
}

1 个答案:

答案 0 :(得分:0)

感谢您的回复。找到答案:问题来自不正确的内存分配。条件

queue[queueEnd] == NULL

实际上从未被实现过,这是对我内存分配的误解。为了解决这个问题,我删除了分配内存的代码块,而只是传入了char **,并且已经初始化了所有指针元素。