gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:38:46 25 4
gpt4 key购买 nike

我正在用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com