c - 重新分配结构会导致堆损坏

标签 c visual-studio struct heap-memory

我正在用 C 语言编写一个程序,用于创建并尝试分配结构体数组。它设法分配第一个内存块,并且我成功地在其上写入了值,但是当我尝试第二次分配时,我收到与损坏的堆和“指定给 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;
    }
}

ma​​in.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;
    }
}

有什么建议或帮助吗?我尝试免费评论和其他一些事情,但仍然是同样的问题,谢谢。

编辑:添加更多代码。

最佳答案

    vende = tmpVende;
    free(tmpVende);

这与以下内容完全相同:

    vende = tmpVende;
    free(vende);

由于 vedetmpVende 是具有相同值的指针,因此将任一者传递给 free 都会做同样的事情 - 释放底层的东西他们都指出。

vende[1].nome = receberString();

因此,这是释放后的使用,会损坏内存。

此外,你还有这个:

sizeof(vendedor)* vende_sz+1

这不能满足您的要求,因为乘法的优先级高于加法。

关于c - 重新分配结构会导致堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37503190/

相关文章:

c - 关于c中struct深拷贝和浅拷贝的问题

c++ - 是否有 true 'smart tabs' 的任何 Visual Studio 加载项?

c - 访问嵌套结构时出现段错误

java - H.323协议(protocol)端点到端点发送和接收什么来发起调用?

c - 看似自动释放指针

c - 静态变量是自动线程局部的吗?

c# - 将 Visual Studio 2008 升级到 2013,将 .NET 3.5 升级到 4.5.1

node.js - 无法将 Node 项目发布到 Azure - 文件名必须少于 260 个字符

for-loop - 从 3 个单独的 slice (每个结构属性一个 slice )创建新的组合结构 slice 时索引超出范围

c - 如何访问作为指针传递给函数的结构中定义的指针变量?