重新分配结构导致堆损坏

时间:2016-05-28 19:46:33

标签: c visual-studio struct heap

我正在用C编写一个程序来创建并尝试分配struct数组。它设法分配第一块内存并且我成功地在其上写了值但是当我尝试第二次分配时,我得到了与损坏的堆相关的错误和“为RtlValidateHeap指定的无效地址”。

这是我的代码(对于葡萄牙语中的某些部分感到抱歉):

structs.h:

typedef struct vendedor
{
    unsigned int numero; 
    char *       nome;
    float        salario;
    uint8_t      comissao;
} VENDEDOR;

functions.h

extern vendedor     * vende = (vendedor *)malloc(0);
extern unsigned int vende_sz = 0;

char * receberString()
{
    int size = 0;
    char temporary;
    char * string = NULL;

    string = (char *)malloc(size);

    while (true)
    {
        scanf("%c", &temporary);

        string = (char *)realloc(string, (size + 1) * sizeof(char));

        if (temporary == '\n')
        {
            string[size] = '\0';
            return string;
        }
        else
            string[size] = temporary;

        size++;
    }
}

vendedor * alocarVende()
{
    vendedor * tmpVende = (vendedor *)
        realloc(vende, sizeof(vendedor)* vende_sz+1); //crashes here at second time

    if (tmpVende == NULL)
    {
        printf("\nfailed to allocate.\n");
        //free(tmpVende);
        exit(-1);
    }
    else
    {
        vende = tmpVende;
        //commented due to problems related
        //free(tmpVende);
        vende_sz++;
        return vende;
    }
}

的main.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
#include "structs.h"
#include "functions.h"

int main() {
    login();
    return 0;
}

bool login() 
{
    if (vende_sz == 0)
    {
        vende = alocarVende();

        vende[0].salario = 666.66;
        vende[0].numero = 1;
        vende[0].comissao = 22;

        vende[0].nome = receberString(); //dynamically allocates memory for a string using realloc
        printf("%s", vende[0].nome);

        vende = alocarVende();

        vende[1].nome = receberString(); //dynamically allocates memory for a string using realloc
        printf("%s", vende[1].nome);

        return true;
    }
}

任何提示或帮助?我试着免费评论和其他一些事情,但仍然是同样的问题,谢谢。

编辑:添加了更多的代码。

1 个答案:

答案 0 :(得分:0)

    vende = tmpVende;
    free(tmpVende);

这与:

完全相同
    vende = tmpVende;
    free(vende);

由于vedetmpVende是具有相同值的指针,因此将一个传递给free会做同样的事情 - 释放它们都指向的基础事物。

vende[1].nome = receberString();

因此,这是一种免费使用会破坏记忆的用法。

另外,你有这个:

sizeof(vendedor)* vende_sz+1

由于乘法的优先级高于加法,因此不能达到你想要的效果。