我确信我在这里遗漏了一个小细节,但我似乎无法指出它。如果您能指出正确的方向,我将非常感激。我有一个用 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/