【问题标题】:Get memory corruption when using realloc function使用 realloc 函数时出现内存损坏
【发布时间】:2020-06-13 07:14:05
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int ind=0;

void rea(int* function)
{
    ind+=1;
    function = realloc(function,sizeof(int) * ind);
    function[ind-1] = 1;
}


int main(void) 
{
    int* fun = malloc(sizeof(int));
    int a =0;
    while(a<400)
    {
        int v = 0;

        rea(fun);
        puts("a");
        a+=1;
        ind+=1;
    }
}

我不知道为什么它给了我错误:双重释放或损坏中止(核心转储)。我每次都增加 ind 并 [ind-1] 来分配值,因此它不应该越界。

【问题讨论】:

  • 函数参数在 C 中按值传递。这意味着rea 修改了来自mainfun 指针的副本,然后该指针立即被丢弃正如rea 返回。您可以修改 rea 以返回重新分配的指针(就像 realloc 本身一样),或者将 int ** 参数传递给它。
  • 对 realloc function = realloc(function,sizeof(int) * ind); 的错误调用。你想重新分配什么?
  • @我正在尝试重新分配function
  • 短版:由于 C 的按值传递语义,function = ...rea 的调用者 (main) 意味着 nothing。它在main 中保留了fun 的原始指针值,最终可以/将悬空。
  • 见下面 Jean 的回答。对功能的任何更改都不会影响乐趣。

标签: c realloc


【解决方案1】:

C 是按值传递的,这意味着在调用的函数中传递的任何参数都不是自己传递的,而是将其值复制到另一个兼容类型的新变量中。因此,当您调用时:

rea(fun)

fun用于初始化function参数。对function 的任何更改都不会影响fun。由于realloc 可能会将旧内存块移动到新位置,如果发生这种情况,则不会反映到fun。唉,当您稍后调用 rea(fun) 时,您会传递一个不再可用的值,该值已被内存管理系统释放。

变化可能是:

void rea(int** function) { // get the address of the pointer
    ind+=1;
    *function = realloc(*function,sizeof(int) * ind); // eventually modify the pointer at the given address
    (*function)[ind-1] = 1;
}

int main(void)  {
    int *fun = malloc(sizeof(int));
    int a = 0;
    while (a<400) {
        int v = 0;   
        rea(&fun); // pass address of the pointer
        puts("a");
        a+=1;
        ind+=1;
    }
}

-----编辑-----

realloc手册说,强调是我的

realloc() 函数尝试改变分配的大小 尖 to by ptr 到大小,并返回 ptr。如果 没有足够的空间 放大 ptr指向的内存分配,realloc() 创建一个新的 分配尽可能多地复制ptr指向的旧数据 到新分配,释放旧分配,并返回一个指针 分配的内存。

【讨论】:

  • 但是为什么执行后会出现这个错误呢?不应该在执行开始时发生?
  • @SadSalad 仅在移动内存时才会发生,但并非总是如此。你永远不会知道realloc 何时移动...打印内存地址(在mainrea 中)你会看到。
猜你喜欢
  • 2021-02-01
  • 2019-05-23
  • 2021-12-26
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
相关资源
最近更新 更多