[英]printf crashes after successful printing
語言是C。我有一個char *類型的數組(char * array [] / char **數組)作為函數參數,我想將它們全部打印到這樣的單獨行中:
while (*array) {
printf("%s\n", *array);
printf("after last print");
array++;
}
現在由於某種原因,通過一定的輸入,它可以打印所有值,但是在最后一個* array打印之后立即崩潰。 因此,在最后一次打印后,它將不再打印“最后一次打印后”。 不幸的是,我在帶有netbeans C支持的Windows 7上,沒有gdb。 當我嘗試將其安裝到netbeans時出現了一些問題,但這是另一回事了。
首先,可能是什么原因造成的? 其次,如果沒有gdb,我該如何最好地調試此行為? 如果有人提供了可以幫助我調試問題並以這種方式解決問題的答案,我也將僅從中獲得一些要點。 一些與導致崩潰的函數參數相關的背景信息:我使用strtok從char *字符串生成char ** arr,其中使用空格作為分隔符。
編輯:
一些更多的信息:如果我在同一個函數中嘗試對最后一個* array進行printf,則它可以正常工作,並且程序可以正常繼續。 所以這工作:
printf("%s\n", array[4]);
在我的測試案例中,NULL之前的最后一個索引恰巧是4。 但是,當像以前一樣在循環內完成相同的操作時,它確實設法對其進行了打印,但此后立即崩潰,不再打印第二行。
如果未將字符串數組的最后一個元素顯式初始化為null,則它將是未初始化的(即, 野生指針),因此在printf
取消引用它時將崩潰。
要做的事情:
這段代碼對我來說很好,不會崩潰:
#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;
}
我注釋掉了使用此功能后的代碼。 這導致代碼完全成功運行。 因此,顯然,代碼的執行順序不是線性的,以致於它將逐行執行。 但是,在最后一個* array打印之后,它試圖執行該函數之后的代碼。 現在,當我注釋掉該代碼時,該函數就像一個吊飾一樣工作。
那些感興趣的人,我注釋掉的代碼與從* array釋放內存有關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.