簡體   English   中英

malloc上的雙指針分段錯誤

[英]Segmentation fault on malloc for double pointer

我正在編寫一個程序,該程序從文件中讀取文本,將其分隔為字母數字單詞,依此類推。 我遇到了一個問題,在該問題中,我已經從文件中讀取了一個字符串,然后嘗試將該字符串定界為一個二維數組,其中每個單詞都存儲在一個數組中。 從那里,我將繼續訂購它們。

但是,當我為單詞[n]分配內存時,出現了段錯誤。 對於我正在使用的測試文件,它具有約400個字符。 沒有一個單詞的長度超過10個字符,因此(j-i + 1)不會是一個很大的分配,它可能導致堆棧溢出(除非我誤解了我的分配)。

我可以根據需要解釋該函數的代碼,它是對我編寫的strsplit()函數的操縱。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    if (argc != 2) {
        printf("Please provide 1 argument.\n");
        return 0;
    }

    FILE *file = fopen(argv[1], "r");
    fseek(file, 0, SEEK_END);
    size_t length = ftell(file); // Getting file size

    char buff, **words, buffer[length + 1];
    int i = 0, j = 0, n = 0, h = 0;

    buffer[length] = '\0';
    rewind(file);
    fread(buffer, 1, length, file); // Read file into buffer, close file
    fclose(file);

    // Deliminate to 2-D array of words
    while (buffer[i] != '\0') {
        while (isalnum(buffer[j]))
            j++;
        i = j;
        while (isalnum(buffer[j]))
            j++;

        words[n] = (char *)malloc(sizeof(char) * (j - i + 1));
        while (i < j)
            words[n][h++] = buffer[i++];

        n += 1, h = 0;
    }
}

值得注意的是,文件輸入有效,並且定界算法有效(它正確地捕獲了文件中從i到j的第一個單詞)。 我需要為** word分配malloc嗎? 我不認為這是問題所在,但是我不知道示例文件中有多少個單詞,因此我將不得不分配大量的單詞。

您從未真正將words的值設置為任何值。 words需要一些記憶才能填充words[n]

您可以執行char** words = malloc(MAX_NUM_OF_WORDS * sizeof(char*))或具有基於堆棧的集合: char* words[MAX_NUM_OF_WORDS]

今天的免費提示:使用沒有NULL檢查的file不是一個好習慣。

暫無
暫無

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

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