当我尝试使用 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 实际上破坏了数组,而不是将其排除在外。有什么想法吗?
你需要使用realloc
.它执行您希望malloc
执行的操作,即允许您扩展先前分配的块。相比之下,malloc
是一次易:你得到你的内存块,这就是你必须使用的。
(来自评论)负担不起
realloc
,因为我必须动态分配数组,并且在重新分配数组时realloc
会清除数组的内容。
事实并非如此:当realloc
扩展分配给程序的内存量,并决定必须重新分配块时,它会将当前块的内容复制到新块中,直到旧块的分配大小,因此新块就可以使用了。因此,您当前的程序会导致内存泄漏。
为了让main
使用分配结果,您必须逐个指针传递指针pole_cien
,即作为float**
。否则,在funkcia_e
中分配它的结果不会传播到main
。
需要考虑的其他几点:
- 不投射
malloc
结果 - 不要将
float
的大小硬编码为4
;请使用sizeof(float)
- 确保
pocet_cien
从零开始,并使用它代替pozicia
;在调用realloc
时添加1
。
很明显,因为 malloc 不会"添加"任何内存,而是分配其中的新块 - 每次都是新鲜的。因此,最终您访问未分配的内存,并且由于索引一直在增加,但您为 4 个元素分配了空间,因此会出现内存错误。