我正在编写一个程序,它将文本文件作为输入,生成单词的索引并在文件和屏幕中打印输出(索引)。
输入文件可能很大。但我们知道文本文件中使用的单词的最大变化是200.我们不知道每个单词的行数和字符的最大值。所以我应该为他们保留一大笔钱。我取了1000行的最大值和每个单词100的最大字符。
我正在使用Turbo C进行编程(我不得不使用它)。编译器只分配64kb内存(包含编译器的大小),所以我必须使用MALLOC。
我的程序应该在这个算法中工作:
它用fgets逐行读取输入文件。然后在当前行中,它用strtok逐字逐句读取。到目前为止,我在第y行有第x个单词。我想把这些单词放在一个指针数组中。所以我需要char * word[200]
。我希望在哪一行中显示多少次,哪个词。所以我需要int index [200][1000]
。如果在第y行,第x个单词存在,我会index[x][y]++
。
所以我现在需要为这些char * word[200]
和int index[200][1000]
分配MALLOC内存。有人可以帮忙吗?我尝试了这些问题的所有答案,但没有一个帮助过。
答案 0 :(得分:2)
你没有正确的malloc。您的malloc(100)仅分配100个字节。你需要
char * words[i] = malloc(sizeof(char *) * 100);
这将分配800个字节(每个8个字节的100个元素(指针的大小))。
同样,在第二个malloc中,你需要两个整数,你需要
int index[i][j] = malloc(sizeof(int *) * 2);
你不应该转向指针;它返回一个void指针,它只是通过赋值隐式地转换为你需要的任何类型的指针。
http://www.cplusplus.com/reference/cstdlib/malloc/
此外:
此外,您尝试将2个字节填充为整数指针或将4个字节(100-96 = 4; 96为8 * 12)填充为字符指针。我不知道世界会做什么。你可以期待的最好的就是你只会丢失某个地方的内存并且有效地拥有12个字符指针和2个内存泄漏。
答案 1 :(得分:1)
如果我了解你
在第一个循环中,我想定义一个 200指针的数组,每个指针都指向一个char块数组。我希望每个指针指向一个最大100字节的数组。含义100个字符块
char **words = NULL;
int i;
words = malloc(sizeof(char*) * 200);
for(i = 0; i < 200; i++) {
words[i] = malloc(100);
}
此处分配200个words
,大小为100字节。
在第二个循环中,我想定义一个int块的2D数组,每个块最多2个字节。意思是 200 * 1000 int blocks 。
int **index = NULL;
int i;
index = malloc(sizeof(int*) * 200)
for (i = 0; i < 200; i++) {
index[i] = malloc(sizeof(int) * 1000);
}
在这里分配200x1000 int
数组。
答案 2 :(得分:0)
char * words = malloc(200*100);
int * index = malloc(200*1000*sizeof(int));
// word[i*200+j] : character j in word i
// index[i*200+j] : int at index i,j
备选方案:
// mallocing an array for storing a maximum of 200 malloced words
char ** words = malloc(200*sizeof(char*));
// adding a new word, at index i, which is pointed to by pszNewWord (null terminated)
words[i] = strdup(pszNewWord);