c - 字符串数组 malloc 后出现 "error reading characters of string"错误

标签 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;
}

最佳答案

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

    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 >。认为自己受到了鞭打。

关于c - 字符串数组 malloc 后出现 "error reading characters of string"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33836433/

相关文章:

c - 在 Matlab 中编译 mex 文件时找不到标准 C 库

c - Microsoft 编译器和 GNU 编译器在输出可执行文件大小方面的差异

c - C 标准对移位比类型宽度更多的位有何规定?

c - 更专业的宏

c - 使用 C 分割 wav 文件

c - 带有种子的随机数生成器

c - 程序崩溃并返回代码 255

c - 如何求数组[N][M]的长度?

尝试在 C 中传递数组时类型冲突

我们不能初始化自动数组变量吗?