2012-05-21 6 views
0

Я получаю эту странную проблему с моим кодом. Malloc возвращает нулевой указатель здесь. У меня есть 3 GB memmory на моем баране, и он не мог выделить несколько байтов. Почему это происходит? Кто-то пожалуйста, помогите ..Malloc не смог выделить память

Вот мой код

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

struct htree{ 
    unsigned char ch; 
    unsigned long int freq; 
    struct htree *left, *right, *parent; 
    }; 

struct code_list{ 
    unsigned char ch; 
    char *code; 
    }; 



typedef struct htree node; 
typedef struct code_list * dict; 

dict codes; 

int readfile(char *filename, long int *char_count) 
{ 
int types = 0; 
FILE *fp = fopen(filename,"rb"); 
unsigned char byteread; 
fread(&byteread,1,1,fp); 
int count=0; 
while(!feof(fp)) 
{ 

       if (char_count[byteread] == 0) 
       { 
       types++; 
       } 
       char_count[byteread]++; 
       fread(&byteread,1,1,fp); 

} 
fclose(fp); 
return types-1; 
} 
node * genhuffnode() 
{ 
node *t = (node *)malloc(sizeof(struct htree)); 
t -> ch = '\0'; 
t -> freq = 0; 
t -> left = NULL; 
t -> right = NULL; 
t -> parent = NULL; 
return t; 
} 

node * genhufftree(long int *char_count, int max_index) 
{ 
node **stack; 
node *temp; 
stack = (node **) calloc(max_index,sizeof(node *)); 
int i,j=0; 
for(i=0;i<256;i++) 
{ 
        if(char_count[i]>0) 
        { 
        stack[j] = (node *)malloc(sizeof(node)); 
        stack[j] -> ch = i; 
        stack[j] -> freq = char_count[i]; 
        stack[j] -> left = NULL; 
        stack[j] -> right = NULL; 
        stack[j] -> parent = NULL; 
        j++; 
        } 
} 

for(i=0;i<=max_index;i++) 
for(j=i+1;j<=max_index;j++) 
if(stack[j] -> freq > stack[i] -> freq) 
{ 
       temp = stack[j]; 
       stack[j] = stack[i]; 
       stack[i] = temp; 
} 
while(i>0) 
{ 
      temp = genhuffnode(); 
      temp -> freq = stack[i] -> freq + stack[i-1] -> freq; 
      temp -> left = stack[i-1]; 
      temp -> right = stack[i]; 
      stack[i-1] -> parent = temp; 
      stack[i] -> parent = temp; 

      for(j=i-2;j>0;j--) 
      { 
           if(temp->freq > stack[j-1]->freq) 
           stack[j+1] = stack[j]; 
           else break; 
      } 
      stack[j] = temp; 
      i--; 
} 
return stack[0]; 
} 

void generatedict(node *root, char *s) 
{ 
if(root == NULL) 
return; 
char *new_code; 

static int index = 0; 

int len = strlen(s)+1; 

if(root->left == NULL && root->right == NULL) 
{ 

       codes[index].ch = root->ch; 
       codes[index].code = (char *) malloc(len*sizeof(char)); 
       strcpy(codes[index].code,s); 
       index++; 
} 
else 
{ 

       new_code = (char *)(malloc(len+1));/// this malloc is causing prob 
       if(new_code == NULL) 
       { 
       printf("Coudnt allocate memory\n"); 
       getchar(); 
       exit(1); 
       } 
       else 
       { 
       strcpy(new_code,s); 
       new_code[len] = '\0'; 
       new_code[len-1] = '0'; 
       generatedict(root->left,new_code); 
       new_code[len-1] = '1'; 
       generatedict(root->right,new_code); 
       } 
} 

free(root); 
return; 
} 

void writedict(int total_entries) 
{ 
FILE *fp = fopen("dictionary","wb"); 
fwrite(codes,sizeof(struct code_list) * total_entries, sizeof(struct code_list) *   total_entries, fp); 
fclose(fp); 
}     

main() 
{ 

    long int char_count[256]; 
    int max_index; 
    max_index = readfile("2.jpg",char_count); 
    node *root_node; 
    root_node = genhufftree(char_count, max_index); 
    codes = (struct code_list *)calloc(256,sizeof(struct code_list));   
    generatedict(root_node,""); 
    writedict(max_index+1); 

    getchar(); 
} 

Note : please keep any file named "2.jpg" in the same folder as the executable 
+1

err - который 'malloc'? – Nim

+4

Это слишком много кода. Пожалуйста, укажите [более простой тестовый пример] (http://sscce.org). –

+0

@OliCharlesworth На самом деле есть странная проблема с этим кодом. Malloc (отмеченный в коде) возвращает NULL, Бог знает почему! У меня достаточно памяти. Вот почему я должен был предоставить полный код. – Akash

ответ

1

Если вы не думаете, что ваша программа исчерпывает память, то, скорее всего malloc() просто думает вы исчерпали память. Это может произойти, если вы освободите нераспределенные указатели, освободите один и тот же указатель более одного раза, перезапишите буфер и т. Д. Отлаживайте свою программу внимательно, ищите эти проблемы и/или используйте valgrind, чтобы найти их автоматически.

+0

Эй, спасибо за ответ. Я не думаю, что я делаю что-то неправильно с «свободным». Это может быть из-за перезаписываемого буфера. Я проверю это. – Akash

3

Моя догадка заключается в том, что ваша программа искажает пул malloc в одном из тех ранних мест, где вы вызываете malloc (есть много вызовов malloc!). Вы не проверяете возвращаемое значение для большинства вызовов malloc.

Я бы посоветовал проверить возвращаемое значение malloc во всех местах, чтобы увидеть, какой из них сбой первым. Также проверьте наличие утечек памяти в коде с помощью valgrind (Linux) или purify (окна).

+0

Эй, спасибо за ответ. Мой код рушился. Поэтому я начал проверять наличие malloc, и я нашел его. Я не мог придумать никаких причин, почему это должно потерпеть неудачу. И если предыдущие malloc's терпят неудачу, тогда код должен быть разбит. И как можно испортить пулы malloc? – Akash

+0

@Akash Не обязательно, чтобы это произошло, если предыдущие mallocs не удались.В этом случае это может привести к повреждению структур пула malloc. Поэтому проверьте все маллоки, а также убедитесь, что вы правильно их освободите. –

+0

Я проверил. Нет проблем с другими mallocs .. – Akash