我在使用 realloc() 处理动态内存分配时,在 C 程序中遇到了一个令人费解的问题

问题描述 投票:0回答:1

我在读取包含长度指示符和以“|”分隔的字段的记录的文件时遇到问题。在这个程序中,我正在阅读有关产品的数量和价格的信息并对它们进行总结。但是,当我尝试使用

realloc()
作为缓冲区变量时,我遇到了意外的行为。奇怪的是,我期望的结果是 118.239998,但是当我使用
realloc()
时,结果变成了 118.275002。令人惊讶的是,当我使用
free(buffer)
然后使用
malloc()
再次为缓冲区分配内存时,我得到了正确的结果。

使用 FREE + MALLOC 进行输出

使用 REALLOC 输出

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char *buffer, *produto;
    int tamRegistro, quantidade;                                                
    float preco, total = 0;
    FILE* arquivo;
  
    arquivo = fopen("compras.txt", "r");

    if (arquivo == NULL) {
        printf("Erro ao abrir o arquivo\n");
        system("pause");
        exit(1);
    }
    //take the first length indicator 
    tamRegistro =fgetc(arquivo);
    buffer = (char*)malloc(sizeof(char) * tamRegistro);
  
    if (buffer == NULL) {
        printf("Falha ao alocar  memoria\n");
        exit(1);
    }
   
    while (fread(buffer, tamRegistro, 1, arquivo) == 1) {
        //separate fields
        printf("LENGTH:%d-", tamRegistro);
        produto = strtok(buffer, "|");
        printf("%s-", produto);         
        quantidade = atoi(strtok(NULL, "|"));
        printf("%d-", quantidade);
        preco = atof(strtok(NULL, "|"));
        printf("%f-\n", preco);
    
        total += (preco * quantidade);
        //take next length indicator
        tamRegistro = fgetc(arquivo);
        free(buffer);
        buffer = (char*)malloc(sizeof(char) * tamRegistro);
        //*buffer=(char*)realloc(buffer,sizeof(char)*(tamRegistro));    
    }
    //if realloc worked * would not be commented and next line would be used
    //free(buffer)
    fclose(arquivo);
    printf("%f\n",total);
  
    return 0;
}
c file malloc realloc
1个回答
0
投票

您使用

strtok
来分解缓冲区,但只要它不以 空字符 结尾,就不包含 字符串;所以你必须再分配一个字节并将 NUL 存储在那里。

© www.soinside.com 2019 - 2024. All rights reserved.