双指针的malloc上的分段错误

双指针的malloc上的分段错误,c,segmentation-fault,malloc,pointer-to-pointer,C,Segmentation Fault,Malloc,Pointer To Pointer,我正在制作一个程序,从文件中读取文本,将其划分为字母数字单词,等等。我遇到了一个问题,我从文件中读入了一个字符串,我试图将该字符串划入一个2d数组,其中每个单词都存储在一个数组中。从那里我将继续订购 然而,当我对单词[n]进行malloc时,我得到了一个segfault。对于我正在使用的测试文件,它有大约400个字符。单词的长度都不超过10个字符,所以j-i+1不会是一个可能导致堆栈溢出的巨大分配,除非我误解了我的分配 如果需要,我可以解释我的函数代码,这是我编写的strsplit函数的操作 #

我正在制作一个程序,从文件中读取文本,将其划分为字母数字单词,等等。我遇到了一个问题,我从文件中读入了一个字符串,我试图将该字符串划入一个2d数组,其中每个单词都存储在一个数组中。从那里我将继续订购

然而,当我对单词[n]进行malloc时,我得到了一个segfault。对于我正在使用的测试文件,它有大约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。

您实际上从未将单词的值设置为任何值。单词需要一些内存才能填充单词[n]

您可以使用char**words=mallocMAX\u NUM\u OF_words*sizeofchar*或使用基于堆栈的集合:char*words[MAX\u NUM\u OF_words]


一天的免费提示:使用不带空检查的文件不是一种好的做法。

您实际上从未将单词的值设置为任何值。单词需要一些内存才能填充单词[n]

您可以使用char**words=mallocMAX\u NUM\u OF_words*sizeofchar*或使用基于堆栈的集合:char*words[MAX\u NUM\u OF_words]


一天的免费提示:使用不带空检查的文件不是一个好的做法。

该死,这就是我想的。我不想设置一些任意的MAX_NUM_单词,但我想这是没有办法的。我同意,这个程序只是在早期阶段,还有很多事情要做,我正在测试阶段,只使用一个特定的文件来让我的函数工作。我将添加空检查。谢谢@DanBan您可以根据需要调整其大小realloc@jenesaisquoi所以每次它在循环中运行时,我都会在添加单词之前重新定位并添加单词的空间?这不会影响它当前的内容,是吗?@DanBan你可以这样做,但我会通过一次重新分配更大的块来限制系统调用。内容不会受到影响,是否使用不同的结构或链接列表?取决于你想对结尾的单词做什么。如果它真的需要数组,那么就像@ JeNeSaSqooi所说的:在块中分配大量实现C++向量;该死,这就是我想的。我不想设置一些任意的MAX_NUM_单词,但我想这是没有办法的。我同意,这个程序只是在早期阶段,还有很多事情要做,我正在测试阶段,只使用一个特定的文件来让我的函数工作。我将添加空检查。谢谢@DanBan您可以根据需要调整其大小realloc@jenesaisquoi所以每次它在循环中运行时,我都会在添加单词之前重新定位并添加单词的空间?这不会影响它当前的内容,是吗?@DanBan你可以这样做,但我会通过一次重新分配更大的块来限制系统调用。内容不会受到影响,是否使用不同的结构或链接列表?取决于你想对结尾的单词做什么。如果它真的需要数组,那么就像@ JeNeSaSqooi所说的:在块中分配大量实现C++向量;