【发布时间】:2018-04-08 23:26:20
【问题描述】:
当我尝试使用 malloc 为数组中的浮点数分配新空间时遇到问题。 我的目标是动态创建数组,并且 malloc 每次我想添加一个新浮点数时为新浮点数添加一个空间。
这是我试图运行的代码,但每次它只分配一个带有 sizeof(float) 的数组,即使变量不断增加。
float *funkcia_e(FILE **subor, int *pocet_cien) {
float *pole_cien;
*pocet_cien = 1;
while (fgets(nazov, sizeof nazov, *subor) != NULL)
{
pole_cien = (float*) malloc((*pocet_cien) * 4);
fscanf(*subor, "%f", &pole_cien[pozicia++]); //This causes problems
*pocet_cien = *pocet_cien + 1;
}
}
int main() {
int pocet_cien = 1;
float *pole_cien = NULL;
funkcia_r(&subor, pole_cien, &pocet_cien);
}
这里是调试记录:https://s.put.re/RR6wqRk.mp4
看来 malloc 实际上破坏了数组,而不是扩展它。有什么想法吗?
【问题讨论】:
-
负担不起重新分配,因为我必须动态分配数组,重新分配时重新分配会清除数组的内容。
-
不相关:一般不要投射
malloc& 朋友或void *的结果。 -
“不能重新分配,因为我必须分配......” - 在盲目假设之前阅读文档!
-
不过,realloc 需要我事先定义数组,这是不允许的。
-
每个新的
malloc()不会初始化任何数据。此代码会丢弃您之前读取的数据。它还严重泄漏内存。您需要使用realloc(),因为它保留了数组中先前初始化的数据;但是您应该避免在每次重新分配时增加 1 使用的空间——这可能会导致糟糕的(二次)性能。 (您对realloc()和malloc()所做的事情有相反的理解 - '看来 malloc 实际上破坏了数组,而不是扩展它' 是错误的;malloc()分配新空间,而 @ 987654330@ 扩展旧空间)。