繁体   English   中英

C中字符串的类型转换数组的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM