2015-11-15 27 views
-1

我確信我錯過了這裏的一個小細節,但我似乎無法把它放在手指上。如果你能指出我正確的方向,我會非常感激。我用C寫的一個非常簡單的排隊功能:Enqueue函數僅在第二次迭代中覆蓋第一個條目

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

看到調用'unqueue'並打印該數組的代碼會很有幫助。 –

+0

感謝您的迴應。我添加了用於打印隊列內容的代碼。 – Kaitlyn

+0

注意:我的打印代碼僅用於調試目的,並且我意識到,當隊列結束迴繞到開始時它不起作用。 – Kaitlyn

回答

0

感謝您的回覆。找到答案:問題來自內存分配不當。條件

queue[queueEnd] == NULL 

從來沒有真正遇到過,這是我對內存分配的一種誤解。爲了解決這個問題,我刪除了分配內存的代碼塊,取而代之的是傳入一個char **,其所有指針元素都已經初始化。

相關問題