簡體   English   中英

在函數內部聲明char數組時出現分段錯誤

[英]Segmentation fault when char array is declared inside function

今天,我在編寫一些C / C ++代碼時遇到了一種奇怪的行為,我想知道這是什么解釋。

這是兩個顯示相同功能的代碼段,第一個具有靜態數組“ char comp [BUFFLEN]”; 在函數外部聲明,而第二個在函數內部聲明。 BUFFLEN的大小定義為1024。我要指的是奇怪的行為:第一個函數運行完美並提供了預期的輸出,而第二個函數則出現了段錯誤。 我知道錯誤在哪里-復制前我沒有為k分配內存(顯然,修復后,兩個變體都可以正常工作),但是我希望有人能告訴我發生了什么以及為什么我第一次沒有得到錯誤一。 謝謝!

char comp[BUFFLEN];
void gen_struct(char* path){
    char pathc[BUFFLEN];
    memset(comp, 0, BUFFLEN);
    comp[0] = '\0';
    strcpy(pathc, path);
    cout << path << endl;
    char* p = strtok(pathc, "/");
    char* k;
    strcpy(k,p);
    do{
        if(p == NULL){
            cout << "Write " << k << " to disk\n";
            break;
        }
        sprintf(comp, "%s/%s", comp, p);
        // strcat(comp, p);
        cout << "Making directory: " << comp << endl;
        // Sysops::mkdir(comp);
        strcpy(k,p);
        p = strtok(NULL, "/");
    }while(true);
}

void gen_struct(char* path){
    char pathc[BUFFLEN];
    char comp[BUFFLEN];
    memset(comp, 0, BUFFLEN);
    comp[0] = '\0';
    strcpy(pathc, path);
    cout << path << endl;
    char* p = strtok(pathc, "/");
    char* k;
    strcpy(k,p);
    do{
        if(p == NULL){
            cout << "Write " << k << " to disk\n";
            break;
        }
        sprintf(comp, "%s/%s", comp, p);
        // strcat(comp, p);
        cout << "Making directory: " << comp << endl;
        // Sysops::mkdir(comp);
        strcpy(k,p);
        p = strtok(NULL, "/");
    }while(true);
}

抱歉,如果標題不合適,我試圖想到有人實際上會谷歌搜索的東西。

僅查看代碼而不進行詳細檢查會顯示明顯的問題

  1. 您不檢查strtok()返回NULL ,取消引用NULL指針是未定義的行為 ,錯誤的行是

     char* p = strtok(pathc, "/"); 

    然后在那之后strcpy()token ”。

  2. 您沒有為k分配空間,因此k沒有被初始化並且它包含垃圾,試圖寫入它所指向的“ 地址 ”是未定義的行為

此行可能很快就會發生此問題

strcpy(k, p)

到達時,無法預測程序的行為,但是當在不同位置聲明/定義變量時,可以預期程序的行為會有所不同,因為程序布局會有所不同,並且行為通常取決於此。

您還好像在使用ac程序一樣工作,盡管它顯然是c ++程序,但是c ++程序員不會使用strtok()char指針來處理字符串,因此c程序員對此幾乎無濟於事,並且必須處理這些事情,因為您正在使用c ++編譯器,我建議使用std::string ,您可以拆分字符串,無需擔心分配內存等問題。

暫無
暫無

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

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