[英]Problem with type-casting array of strings in C
我正在尝试从文本文件到字符串数组读取大量英语单词。 单词数为2016415,单词的最大长度为69个字符。
如果我定义类似“ char data [2016415] [70];”的数组,则在运行程序时会出现堆栈溢出。
因此,我尝试改用calloc(),但是我不明白如何键入它,使其等效于“ char data [2016415] [70];”。
下面的程序在编译过程中返回“在不进行强制转换的情况下,传递fgets make arg的arg 1而没有强制转换”的警告。 当我执行它时,它会出现“异常:STATUS_ACCESS_VIOLATION”问题。
你能帮助我吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char *data; //data[2016415][70];
int i;
FILE *fsol;
fsol = fopen("C:\\Downloads\\abc\\sol2.txt","r");
data = (char*) calloc(2016415,70);
for(i=0;i<2016415;i++){
fgets(data[i] , 70 , fsol);
}
fclose(fsol);
return 0;
}
好的,对先前的建议感到抱歉。 我忘了数组有多可怕。 该测试用一个10个单词的小型数据集进行测试,但是它应该可以扩展到您的单词数。 请注意,fgets()似乎会将行尾作为前一个单词的一部分。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_WORD_CNT 2016415
#define MAX_WORD_LEN 70
int main(void)
{
char *data; //data[2016415][70];
int i;
FILE *fsol;
fsol = fopen("C:\\Downloads\\abc\\sol2.txt","r");
data = (char*) calloc(MAX_WORD_CNT, MAX_WORD_LEN);
// check for valid allocation
if (data == NULL)
{
return 1;
}
for(i=0; i<MAX_WORD_CNT; i++)
{
fgets(&data[i * MAX_WORD_LEN], MAX_WORD_LEN, fsol);
}
fclose(fsol);
return 0;
}
calloc
只是分配大量的内存-而不是指向其他数组的指针数组。
fgets
期望指向一个指针,该指针应将其内容转储到该内存位置。
因此,而不是给它的内容data[i]
你想给它的地址data[i]
因此可以把它的东西在那里。
fgets(&data[i], 70, fsol);
您可能还需要调整循环,以使其一次上升70多个字符,而不是一个。
这是我分配数组的方式
char **data = malloc(MAX_WORD_CNT * sizeof(char *));
for(int i = 0; i < MAX_WORD_CNT; i++)
data[i] = malloc(MAX_WORD_LEN);
您可能想为malloc添加一些错误检查。
data
是指向char的指针(也可以作为char数组寻址),因此data[i]
是单个char。 fgets
需要一个指向char的指针,但是您要向其传递一个char; 这就是为什么您收到警告的原因,您正在尝试使用char(整数)作为指针。
当您运行程序时,它随后将使用单个char参数并将其解释为指向char的指针,因此由于该char的值不是有效地址而导致访问冲突。
因此,在循环中,您应该将fgets
指针传递给data
并在每次迭代时将其递增70。 您可以使用&data[i]
形式的“指向数组元素的指针”并递增i或简单指针形式,将另一个初始设置为data
指针变量本身递增。
答案很简单:您不要投放。 转换结果malloc
/ calloc
/ calloc
没有目的,但是如果您忘记包含stdlib.h
则可能具有隐藏主要错误的副作用。 这些分配函数的返回类型为void *
,将自动转换为所需的内容。
如果您真的想知道类型, (char (*)[70])
。 但是请实际上不要通过编写代码来混淆您的程序。 (除非您实际上是在编写C ++,否则在这种情况下,您应该标记问题C ++而不是C,或者最好使用new
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.