Malloc不会添加新内存

时间:2018-04-08 23:26:21

标签: c arrays pointers malloc

当我尝试使用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实际上破坏了阵列,而不是将其篡改。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您需要使用realloc。它可以执行您希望malloc执行的操作,即允许您扩展先前分配的块。相比之下,malloc是一次性的交易:你得到了你的记忆障碍,这就是你必须要做的事情。

  

(来自评论)不能realloc,因为我必须动态分配数组,而realloc会在重新分配时清除数组的内容。

事实并非如此:当realloc扩展分配给您的程序的内存量,并决定它必须重新分配该块时,它复制当前块的内容进入新块,直到旧块的分配大小,因此新块可以使用。因此,您当前的程序会导致内存泄漏。

为了让main使用分配结果,您必须通过指针传递指针pole_cien,即float**。否则,在funkcia_e内分配的结果不会传播到main

要考虑的其他几点:

  • 不要投放malloc结果
  • 请勿将float的大小硬编码为4;使用sizeof(float)
  • 确保pocet_cien从零开始,并使用它代替pozicia;在致电1时添加realloc

答案 1 :(得分:0)

很明显,malloc不会“添加”任何内存,而是分配一大块新内存 - 每次都是新鲜的。因此,最终您访问未分配的内存并且因为索引一直递增而得到内存故障,但您为4个元素分配了空间。