c - 如何解决以下函数中的内存分配问题?(malloc)
问题描述
我需要读取一个 .txt 文件并将文件中的每个单词分配到一个结构体中,该结构体从结构向量中指向。我将在下面更好地解释。
我感谢您的帮助。
我的程序只分配文件的第一个字......
我知道问题出在函数 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() 是负责启动 MAP 的函数,将 10 个指针块分配给结构“项目”。
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
由于尚未分配值而失败。将未初始化的指针p
p 传递给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);
完成后一定要释放内存。
可能存在其他问题。
推荐阅读
- java - queue.yaml 中的 AppEngine 单元测试非默认队列
- php - php中如何正确使用str_replace进行替换
字符串中的字段? - javascript - react-native : 更新状态然后用 addListener 检查
- javascript - 如何通过 tabulator Plugin 编辑生成的表格
- karate - 如何在 karateUI 驱动程序中处理 SSL 证书?
- amazon-web-services - AWS Opsworks 未能添加 EC2 实例
- ios - 线程 1:将子视图添加到主视图时 AppDelegate 中的信号 SIGABRT 错误
- javascript - Diff2html 差异未加载
- python - 在python中,如何通过条件在一维数组的对应元素上快速设置二维数组每一行的值?
- java - 复制粘贴链接应该被重定向到主页