文件导入时的 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 8
在 float 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=]';
我正在编写一个很长的程序,其中包含大量数据导入,但我开始遇到错误 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
strtof()
的第一个参数必须是以 null 结尾的字符串。您没有在 // write string
循环之后添加空终止符。
int i;
for (i=0; c != '\n'; ++i) {
s[i] = c;
c = fgetc(fptr);
}
s[i] = '[=10=]';