首页 > 解决方案 > 文件导入时的 C 内存问题

问题描述

我正在编写一个包含大量数据导入的相当长的程序,但我开始遇到错误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 8在线float f = strtof(s,&a);上。我用strtof()错了吗?

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

标签: cimportvalgrind

解决方案


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

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

推荐阅读