malloc上的双指针分段错误

时间:2018-02-19 23:02:47

标签: c segmentation-fault malloc pointer-to-pointer

我正在编写一个程序,从文件中读取文本,将其分隔为字母数字,依此类推。我遇到了一个问题,我从文件中读到了一个字符串,并且我试图将该字符串分隔成一个二维数组,其中每个单词都存储在一个数组中。从那里我将继续订购它们。

但是,当我使用malloc for words [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的文件中的第一个单词)。我需要malloc来获取**字吗?我不认为这是问题,但我不知道样本文件中有多少单词,所以我需要大量的malloc。

1 个答案:

答案 0 :(得分:4)

您实际上从未将words的值设置为任何值。在填充words之前,words[n]需要一些记忆。

您可以char** words = malloc(MAX_NUM_OF_WORDS * sizeof(char*))或拥有基于堆栈的集合:char* words[MAX_NUM_OF_WORDS]

当天的免费提示:使用file而不进行NULL检查不是一种好习惯。