2016-06-25 200 views
0

語言是C.我有一個char *類型(char * array []/char **數組)作爲函數參數的數組,我想將它們全部打印成如下所示的單獨行:printf在打印成功後崩潰

while (*array) { 

     printf("%s\n", *array); 
     printf("after last print"); 
     array++; 
    } 

現在出於某種原因,使用某個輸入,它管理打印所有的值,但在打印最後一個*數組後立即崩潰。因此在最後一次printf之後,它不再打印「最後一次打印後」。不幸的是,我在Windows 7上使用netbeans C支持,沒有gdb。當我嘗試將其安裝到netbeans時出現了一些問題,但這是另一回事。

首先,有什麼可能導致這種情況?其次,我怎麼能沒有gdb嘗試調試這種行爲最好?如果一個人提供了一個答案,幫助我調試問題並以這種方式解決問題,那麼我也會單獨給予答案。與導致崩潰的函數參數相關的一些背景信息:我使用strtok從char *字符串中生成char ** arr,其中空格用作分隔符。

編輯:

一些更多的信息:如果我同樣的函數內儘量給printf的最後一個*陣列,它工作正常,程序繼續正常進行。所以這個工作原理:

printf("%s\n", array[4]); 

在我的測試用例中NULL前面的最後一個索引恰好是4。但是當同樣的事情在前面看到的循環內部完成時,它確實能夠打印它,但是之後立即崩潰,而不是再打印第二行。

+0

很可能最後一個數組元素沒有用NULL指針設置。你需要像'array [n] = NULL;',其中'n'是字符串的數量。當然,「陣列」需要一個空間來容納「n + 1」元素。 –

回答

2

如果你沒有明確初始化字符串數組的最後一個元素爲空,這將是一個未初始化(即野生指針),所以當你取消對它的引用在printf它會崩潰。

可以做的事:

  1. 明確初始化字符串數組的最後一個元素爲NULL,這樣的循環就知道該停在年底。
  2. 不是增加指針,而是使用循環計數器變量遞增其解除引用它的偏移量。

此代碼工作對我蠻好,並不會崩潰:

#include <stdio.h> 
char *array[] = { "Hello", "World", "My", "Name", "Is", "Govind", "Parmar", NULL } ; 

int main() 
{ 
    int i; 
    for(i = 0; *(array+i); i++) 
    { 
     printf("%s\n", *(array+i)); 
    } 
    printf("after last print\n"); 
    return 0; 
} 
+0

我測試過了,最後一個是NULL,並且它在設法打印最後一個*數組後仍然崩潰,但是不會打印最後一個打印後的'anymore = /。 –

+0

@ VilleMiekk-oja查看我編輯的答案 –

+0

使用你的代碼我可以讓程序進入一個狀態,在這個狀態下它會在上次打印之後打印出來,然後崩潰。之後它會崩潰到無記憶功能。我不明白爲什麼它沒有在我的代碼版本中打印它,即使它顯然崩潰到函數後面的代碼。但是你的代碼以某種方式做到了,所以我會給你正確的答案。 –

0

我註釋掉使用這一功能後所涉及的代碼。這導致代碼運行完全成功。顯然,代碼的執行順序並不是線性的,它將以一行一行的方式執行。但在最後一次*數組打印後,它試圖執行函數後面的代碼。現在,當我註釋掉代碼時,該函數就像一個魅力。

那些有興趣的人,我註釋到的代碼涉及從*數組中釋放內存。