c - 文件导入时的 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
解决方案
的第一个参数strtof()
必须是一个以 null 结尾的字符串。您没有在// write string
循环之后添加空终止符。
int i;
for (i=0; c != '\n'; ++i) {
s[i] = c;
c = fgetc(fptr);
}
s[i] = '\0';
推荐阅读
- php - Dompdf 未正确显示自定义字体
- xamarin.forms - Xamarin 表单 ListView 条目字段传输
- max - Tableau 计算字段 - 跨多个度量
- node.js - 如何将图像从 URL 上传到 Firebase 存储?
- java - Observable 只发出第一个值
- javascript - Javascript 类 getter setter 在单元测试中显示 Uncovered Line
- date - 如何使用变量使 Ansible to_datetime 过滤器在循环内工作
- python - 如何在 X 轴上绘制当前时间
- sql - 如何使用 Spring CrudRepository 进行自定义查询在存储库中使用两个或多个实体
- unit-testing - 在 F# 中使用条件参数进行基于属性的测试