c - malloc 不添加新内存

标签 c arrays pointers malloc

当我尝试使用 malloc 为数组内的 float 分配新空间时遇到问题。 我的目标是动态创建数组,并在每次要添加新 float 时使用 malloc 为新 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);
}

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

看起来 malloc 实际上破坏了数组,而不是扩展它。有什么想法吗?

最佳答案

您需要使用realloc。它执行您想要 malloc 执行的操作,即让您扩展先前分配的 block 。相比之下,malloc 是一次性交易:您获得内存块,这就是您必须使用的内容。

(from the comment) cant afford to realloc, as I have to allocate the array dynamically and realloc would purge the contents of array when reallocating it.

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

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

需要考虑的其他几点:

  • 不要强制转换 malloc 结果
  • 不要将float的大小硬编码为4;使用sizeof(float)
  • 确保pocet_cien从零开始,并用它代替pozicia;在调用 realloc 时添加 1

关于c - malloc 不添加新内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49723789/

相关文章:

c - "multidimensional array pointer +1"的值不匹配

javascript - 从数组中获取最大且唯一的数字

c++ - 将值插入可能为空指针的更简单方法

c - 函数指针的地址和函数指针的内容是一样的吗?

C : Acessing a structure within a structure

清除最低有效位

java - 是否可以对对象数组进行冒泡排序?

arrays - 如何找到两个数组中的最小交换

c - malloc() 的返回值和数组名有什么区别

c - 为什么++(*p) 没有给出 l-value required 错误?