簡體   English   中英

成功打印后,printf崩潰

[英]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取消引用它時將崩潰。

要做的事情:

  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;
}

我注釋掉了使用此功能后的代碼。 這導致代碼完全成功運行。 因此,顯然,代碼的執行順序不是線性的,以致於它將逐行執行。 但是,在最后一個* array打印之后,它試圖執行該函數之后的代碼。 現在,當我注釋掉該代碼時,該函數就像一個吊飾一樣工作。

那些感興趣的人,我注釋掉的代碼與從* array釋放內存有關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM