c - 入队函数仅在第二次迭代时覆盖第一个条目

标签 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

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

此外,这里是调用排队的代码片段。 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;
    }
}

最佳答案

感谢您的回复。找到答案:问题出在内存分配不当。条件

queue[queueEnd] == NULL

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

关于c - 入队函数仅在第二次迭代时覆盖第一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33717130/

相关文章:

linux - 向本地 Linux FIFO 队列提交命令

c++ - Clion 的调试器正在运行程序,但常规控制台却没有。

c - 了解 printf 的隐式转换

java - Web 应用程序、集群 tomcat 和 mongoDB - 如何实现持久队列

c++ - 如何验证数据类型输入

java - 何时、何地以及如何使用队列?

scala - 在不断增长的 scala.collections.mutable.Queue 上有没有一种优雅的 foldLeft 方法?

c - 是什么导致字符串连接中的段错误?

如果我收到指针地址和指向指针的指针,我可以从函数修改指针值吗?

c - c99 中的同时结构成员初始化和定义