我确信我在这里错过了一个小细节,但我似乎无法将手指放在上面。如果你能指出我正确的方向,我会非常感激。我有一个用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;
}
}
答案 0 :(得分:0)
感谢您的回复。找到答案:问题来自不正确的内存分配。条件
queue[queueEnd] == NULL
实际上从未被实现过,这是对我内存分配的误解。为了解决这个问题,我删除了分配内存的代码块,而只是传入了char **
,并且已经初始化了所有指针元素。