文件导入时的 C 内存问题

C memory issues on file import

我正在编写一个很长的程序,其中包含大量数据导入,但我开始遇到错误 munmap_chunk(): invalid pointer。我环顾四周,这似乎是由 free() 函数引起的。然后我在我的程序中评论了所有这些功能,但错误仍然发生。我所能找到的只是这可能是由内存问题引起的,我应该 运行 Valgrind。所以我这样做了,它返回了一大堆主要与我的导入函数相关的错误。特别是这个:

void import_bn(int depth, int idx, float pdata[4][depth]) {

    // [0][:] is gamma, [1][:] is beta, [2][:] is moving mean, [3][:] is moving variance

    // Define name from index
    char name[12]; // maximum number of characters is "paramxx.csv" = 11
    sprintf(name, "param%d.csv", idx);

    // open file
    FILE *fptr;
    fptr = fopen(name, "r");
    if (fptr == NULL) {
        perror("fopen()");
        exit(EXIT_FAILURE);
    }

    char c = fgetc(fptr); // generic char
    char s[13];           // string, maximum number of characters is "-xxx.xxxxxxx" = 12
    char* a;              // pointer for strtof

    for (int t = 0; t < 4; ++t) { // type
    for (int d = 0; d < depth; ++d) { // depth

        //skip S
        if (c == 'S') {c = fgetc(fptr);c = fgetc(fptr);}

        // write string
        for (int i=0; c != '\n'; ++i) {
            s[i] = c;
            c = fgetc(fptr);
        }

        float f = strtof(s,&a); // convert to float
        pdata[t][d] = f;     // save on array
        c = fgetc(fptr);
    }}

    fclose(fptr);
}

应该打开的文件始终具有以下格式:

0.6121762
1.5259982
1.6705754
0.6907939
0.5508608
1.2173915
S
2.2555487
2.9224594
-1.6631562
-1.2156529
1.6944195
1.0379710
...etc

所以基本上它们是用'\n'分隔的float32s,每个批次都用“S”分隔。这表示一个多维数组,在这个函数的情况下,总是恰好有 4 个批次,但大小不同。

Valgrind 中经常出现的错误之一是 Use of uninitialised value of size 8float f = strtof(s,&a); 行。我使用 strtof() 错了吗?

可以在此处找到 Valgrind 的完整结果:https://pastebin.com/rKwTUgut

strtof() 的第一个参数必须是以 null 结尾的字符串。您没有在 // write string 循环之后添加空终止符。

        int i;
        for (i=0; c != '\n'; ++i) {
            s[i] = c;
            c = fgetc(fptr);
        }
        s[i] = '[=10=]';