双指针的 malloc 分段错误
Segmentation fault on malloc for double pointer
我正在制作一个从文件中读取文本、将其分隔为字母数字单词等的程序。我 运行 遇到了一个问题,我从文件中读入了一个字符串,我试图将该字符串分隔为一个二维数组,其中每个单词都存储在一个数组中。从那里我将继续订购它们。
但是,当我为 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] = '[=10=]';
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] != '[=10=]') {
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 的第一个单词)。我需要为 **words malloc 吗?我不认为这是问题所在,但我不知道示例文件中有多少个单词,所以我必须 malloc 一些大的数量。
您实际上从未将 words
的值设置为任何值。 words
需要一些内存才能填充 words[n]
。
您可以 char** words = malloc(MAX_NUM_OF_WORDS * sizeof(char*))
或者有一个基于堆栈的集合:char* words[MAX_NUM_OF_WORDS]
当天的免费提示:使用 file
而不进行 NULL 检查不是好的做法。
我正在制作一个从文件中读取文本、将其分隔为字母数字单词等的程序。我 运行 遇到了一个问题,我从文件中读入了一个字符串,我试图将该字符串分隔为一个二维数组,其中每个单词都存储在一个数组中。从那里我将继续订购它们。
但是,当我为 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] = '[=10=]';
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] != '[=10=]') {
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 的第一个单词)。我需要为 **words malloc 吗?我不认为这是问题所在,但我不知道示例文件中有多少个单词,所以我必须 malloc 一些大的数量。
您实际上从未将 words
的值设置为任何值。 words
需要一些内存才能填充 words[n]
。
您可以 char** words = malloc(MAX_NUM_OF_WORDS * sizeof(char*))
或者有一个基于堆栈的集合:char* words[MAX_NUM_OF_WORDS]
当天的免费提示:使用 file
而不进行 NULL 检查不是好的做法。