2017-06-04 28 views
0

我的程序包含一個菜單,您可以在其中選擇2個選項中的1個。 第二個就是退出程序。然而,第一個地方是你可以在一個單獨的帶有100.000行的「.txt」文件中找到你選擇的特定位序列。如何重置c中分配的內存和資源?

它做我想第一次,然後返回到菜單。

問題是當用戶進行第二次(或更多)搜索時。該程序在屏幕上打印隨機信息。 看起來好像我沒有對第一次搜索中的資源,內存或值進行「重置」。

#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和內容。我通過做免費(z)結束功能,但是當我再次搜索該程序只是打印隨機的東西。

+1

'//一些代碼,不會對這個問題無關緊要'請發佈代碼告訴某些內容,例如[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

+0

'e'應該是一個'int',因爲'fgetc'返回一個'int' –

+1

這只是一個錯字,DADO * z而不是'DATA * z'? – deamentiaemundi

回答

0

使用未初始化的變量而沒有干預賦值是未定義的行爲。 它可以在每個月的第一個星期三通過循環工作,第一時間,只有當老闆看,...

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

的realloc順便說

void *realloc(void *ptr, size_t size) 

返回void加上它通過引用需要一個指針作爲輸入,以便其通。

更新:該函數返回一個指向新分配的內存的指針,如果請求失敗則返回NULL。

我不好。

+0

但是'z' _was_由'realloc'分配 –

+0

realloc void void realloc(void * ptr,size_t size)@CoolGuy – KALALEX

+0

您不需要將它賦值給z,因爲realloc將指針作爲輸入傳遞給它的pass引用。 – KALALEX