“错误读取字符串的字符”错误在malloc之后的字符串数组

时间:2015-11-20 21:34:03

标签: c

每次我尝试为字符串数组分配内存时,我的程序都会失败并显示错误消息“读取字符串字符时出错”。 我究竟做错了什么?我的内存分配有问题吗?

char** file2array(char *filename)
{
    FILE *fp = fopen(filename, "r");

    int i;
    int max_line_len = 20;
    int num_lines = 6;
    char** lines = (char **) malloc(sizeof(char*) * (num_lines + 1));

    fseek(fp, 0, SEEK_END);
    int chars_num = ftell(fp);
    rewind(fp);

    for (i = 1; i < (num_lines + 1); i++) {
        lines[i] = (char *) malloc(max_line_len + 1);
        fgets(lines[i], chars_num, fp);
    }

    fclose(fp);
    return lines;
}

1 个答案:

答案 0 :(得分:1)

您似乎没有提供实际发出错误消息的代码,因此很难确定它在抱怨什么。但是,您的循环索引确实存在问题:

    for (i = 1; i < (num_lines + 1); i++) {
        lines[i] = /* ... */

变量i1num_lines运行,从不取值0,因此是动态指针数组中的第一个指针(索引为0永远不会初始化。这是一个合理的解释,为什么一些后来的代码可能在阅读字符时遇到问题。

此外,您错误地使用fgets()。你告诉它你的缓冲区长chars_num字节,但它们实际上是max_line_len + 1字节长。这表示缓冲区溢出的可能性。

确实,我不确定chars_num应该是什么意思。您将其初始化为文件的长度(假设该长度适合int),但我没有看到它是如何有用的。

此外,如果正在读取的文件的行数超过您所考虑的行数(20个字节,包括行终止符)或行数与您预期的不同(6),则您的函数可能会返回意外结果。

我没有看到你的内存分配存在任何固有的问题,但如果我没有给你一个强烈的舌头绑定来投射malloc()的返回值,那么它就不会是StackOverflow。考虑自己被鞭打。