我正在编写一个程序,该程序以文本文件为输入,对其中的单词进行索引,并在文件和屏幕中打印输出(索引)。
输入文件可能是巨大的。但我们知道,在文本文件中使用的单词的最大种类是200。我们不知道每个单词的最大行数和字符数是多少。所以我应该为他们保留一大堆。我取了最多1000行,每个单词最多100个字符。
我正在用Turbo C编程(我被迫使用它)。编译器只分配64kb的内存(包括编译器的大小),所以我必须使用MALLOC。
我的程序应该使用这种算法:它使用fgets逐行读取输入文件。然后在当前行中,它使用strtok逐字读取。到目前为止,我已经有了第x个单词。我想把单词放在一个指针数组中。所以我需要一个字符[200]。我想展示一下哪个单词在哪行重复了多少次。所以我需要一个int索引[200][1000]。如果在yth行中,第x个单词存在,我会索引[x][y]++。
所以现在我需要为这些char*word[200]和int index[2000][1000]分配MALLOC内存。有人能帮忙吗?我试过了这些问题的所有答案,但都无济于事。查看错误:
char **words;
words = malloc(sizeof(char*) * 200);//cannot conver void * to char **
for(int i = 0; i < 200; i++)
words[i] = malloc(100);//cannot convert void * to char *
int **index;
index = malloc(sizeof(int*) * 200)//cannot convert void * to int **
for (i = 0; i < 200; i++)
index[i] = malloc(sizeof(int) * 1000);
malloc
函数返回一个void *
对象,您可以将其视为"指向未定义类型的指针"。当你不知道指针指向什么样的对象时,这是C格式化指针的方法
Turbo C发出的错误意味着,如果不将void *
显式转换为其他类型的指针(例如char **
变量或int *
),则不允许将其分配给该类型。您可以通过以下方式编写malloc调用来做到这一点:
char **words;
words = (char **) malloc(sizeof(char*) * 200);
for(int i = 0; i < 200; i++)
words[i] = (char *) malloc(100);
int **index;
index = (int **) malloc(sizeof(int*) * 200);
for (i = 0; i < 200; i++)
index[i] = (int *) malloc(sizeof(int) * 1000);
现在,从malloc
中转换结果是非常不受欢迎的,但如果您必须使用一个将隐式指针转换视为错误的编译器,那就见鬼去吧。:-)
您的编译器不符合C标准:在C中,您可以将任何void*
隐式转换为任何其他指针(反之亦然)。所以线路
int* foo = malloc(sizeof(*foo));
是完全有效的C代码。
然而,您的编译器需要以下内容:
int* foo = (int*)malloc(sizeof(*foo));
告诉它你真的想把void*
转换成int*
。你可以用模拟的方式修复你的代码。
旁注:记住这一点很好,因为C++和编译器有同样的问题(唯一的区别是C++中的标准过于挑剔)。因此,在C++中,第一个变体也是非法的。