Malloc不会添加新内存

jac*_*kar -3 c arrays malloc pointers

当我尝试使用malloc为我的数组中的浮点数分配新空间时,我遇到了麻烦.我的目标是动态创建数组,每次我想添加一个新的float时,malloc都会为new float添加一个空间.

这是我试图运行的代码,但每次只分配一个带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);
}
Run Code Online (Sandbox Code Playgroud)

以下是记录的调试:https://s.put.re/RR6wqRk.mp4

似乎malloc实际上破坏了数组,而不是对它进行篡改.有任何想法吗?

das*_*ght 5

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

(从评论中)无法承受realloc,因为我必须动态分配数组,并realloc在重新分配时清除数组的内容.

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

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

还有一些要考虑的要点:

  • 不要施放malloc结果
  • 不要硬代码大小float4; 使用sizeof(float)
  • 确保pocet_cien从零开始,并用它代替pozicia; 加上1电话realloc.