如何重置c中分配的内存和资源?

时间:2017-06-04 14:28:44

标签: c memory-management free

我的程序包含一个菜单,您可以在其中选择2个选项中的一个。 第二个是退出该计划。但是,第一个是您可以在单独的" .txt"中找到您选择的特定位序列的位置。文件有100.000行。

它首次执行我想要的操作,然后返回菜单。

问题是当用户进行第二次(或更多次)搜索时。该程序在屏幕上打印随机信息。 好像我没有做过"重置"第一次搜索时的资源,内存或值。

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

typedef struct{

    char ID[8];
    char content[2048];
    int distance;

} DATA;

void search(){

    FILE *f;
    DADO *z=NULL;
    long int tot=0;
    int a;
    int c;
    int i;
    int j=1;
    int k=0;
    char e;
    char b[2048];

    printf("\n");

    f=fopen("DANGER_DB_LARGE.txt", "r");

    printf("\n");
    printf("How many results do you wish?\n");
    scanf("%d",&a);

    printf("Introduce the sequence:\n");
    scanf("%s",b);
    c=strlen(b);

    printf("\n");

    z=(DATA*)realloc(z,(++tot)*sizeof(DATA));

    while(e!=EOF){
        e=fgetc(f);

        if(k<8){
            z[tot-1].ID[k]=e;           
        }
        else if(k==8 && e=='\t'){
            continue;
        }
        else if(k>=9 && e!='\n'){
            z[tot-1].content[k-9]=e;
        }
        else if(e=='\n'){
            k=(-1);
            z=(DATA*)realloc(z,(++tot)*sizeof(DATA));
        }
        k++;
    }

    for(i=1; i<=tot; i++){
        distance(z,i,c,b);
    }

    free(z);
    fclose(f);
}

我继续存储这100.000行文本中每一行的ID和内容。我通过 free(z)来结束这个功能,但是当我再次搜索时,程序只是打印随机的东西。

2 个答案:

答案 0 :(得分:0)

Realloc按照

的方式返回void
void *realloc(void *ptr, size_t size)

加上它将一个指针作为输入,因此它通过引用传递。

更新:此函数返回指向新分配内存的指针,如果请求失败则返回NULL。

我的坏。

答案 1 :(得分:0)

使用未初始化的变量而没有介入的赋值是未定义的行为。 它可能在每个月的第一个星期三工作,第一次通过循环,只有在老板正在寻找时,......

int e; // originally was char
//...
while (e != EOF) { // uninitialised, no intervening assignment