gpt4 book ai didi

c - 如何解决以下函数中的内存分配问题? (分配)

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:33 26 4
gpt4 key购买 nike

我需要读取一个 .txt 文件并将文件中的每个单词分配到一个结构中,该结构从结构 vector 指向。我将在下面更好地解释。

感谢您的帮助。

我的程序只分配文件的第一个字...

我知道问题出在函数 insere_termo() 中,因为我已经测试了 fscanf whitout 调用该函数并且它运行正常。

结构

typedef struct _item
{
int conta; //contador
char *termo; //palavra
} Item;

typedef struct _mapa
{
int total; // número de itens no mapa
int blocos; // número de blocos de itens alocados
Item **lista; // vetor de ponteiros para itens
} Mapa;

主要

int main()
{
Mapa mp;
FILE *arq;
int i, result, numPalavras;
float x;
int valor, max, min, mincar;
char caminho[20];
char termo[40];
int tam;

inicia_mapa(&mp);

valor = menu();

这是我的代码的重要部分。我在用户提供的路径中读取文件并调用函数 insere_termo();,它负责分配 struct 中的每个单词。

switch (valor)
{
case 1:
printf ("*Ler Arquivo* \n");
printf("Digite caminho: ");
scanf("%s", caminho);

arq = fopen(caminho,"r"); // abrir arquivo no caminho especificado
if (arq == NULL)
{
printf("Erro, nao foi possivel abrir o arquivo\n");
}

while(fscanf(arq, "%s", termo) != EOF)
{
//Adiciona cada palavra no vetor
insere_termo(&mp, termo);
}

break;

函数

INICIA_MAPA() 是负责启动映射的函数,将包含 10 个指针的 block 分配给结构“项目”。

INSERE_TERMO() 是负责分配文本文件给出的单词的函数。内存分配存在一些问题,但我无法解决。欢迎任何帮助。

void inicia_mapa (Mapa *mp) //inicia um mapa vazio
{
mp->lista = (Item**)malloc(BLOCK*sizeof(Item*));
mp->total = 0;
mp->blocos = 1;
}

void insere_termo (Mapa *mp, char *s) // insere um item com termo s e conta = 1
{

if ((mp->total != 0)&&((mp->total%BLOCK) == 0))
{
mp->lista = (Item**)realloc(mp->lista,(mp->blocos+1)*BLOCK*(sizeof(Item*)));
mp->blocos++;
}

mp->lista[mp->total] = (Item*) malloc(sizeof(Item)); // alocação dinâmica de item no mapa

if (mp->lista[mp->total] == NULL)
{
printf("Erro na alocacao de memoria\n");
exit(0);
}

strcpy(mp->lista[mp->total]->termo, s); // Insere termo s
printf("%s\n", mp->lista[mp->total]->termo);
mp->lista[mp->total]->conta++;
mp->total++; // contagem do total

}

最佳答案

strcpy(mp->lista[mp->total]->termo, s); 失败为 mp->lista[mp->total]->termo 尚未赋值。将未初始化的指针 pp 传递给 strcpy(p, ...)未定义的行为 (UB)。

而是分配内存,然后使用 strcpy() 进行复制

// strcpy(mp->lista[mp->total]->termo, s);
p->lista[mp->total]->termo = malloc(strlen(s) + 1);
strcpy(p->lista[mp->total]->termo, s);
// or
p->lista[mp->total]->termo = strdup(s);

一定要在完成后释放内存。


可能存在其他问题。

关于c - 如何解决以下函数中的内存分配问题? (分配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55885441/

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