2012-06-20 4 views
0

Что следует за моей программой. Я создаю структуру, используя malloc для выделения памяти, потому что мне нужен очень большой массив struct, а затем передаю этот массив структуры в функции. Функции не важны, потому что я не могу выйти из основной программы. Мое замешательство - мой компилятор (gcc), говорящий, что every_event не объявлен, когда я пытаюсь его освободить, но нигде больше. Когда я комментирую свободный оператор, который он компилирует, но тогда valgrind говорит, что у меня есть неправильная запись размера 4, когда я делаю строку each_event [i] .timestamp = tim [i]. Строка выше, которая закомментирована, потому что valgrind говорил мне, что там была ошибка (я скомпилировал gcc -g -O0), хотя я знал, что это должно означать следующую строку.C -Struct массив, проблемы со свободными, проблемы с назначением значений в моем массиве struct

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

#define event_length 512 
#define bits_n_byte 8 
#define timestamp_bytes 8 

typedef enum type { 
    DATA, CLOCK, EXPECTED, SPILL, ALL 
} type; 

typedef struct event { 
char clocbuffer[event_length*bits_n_byte]; 
char datbuffer[event_length*bits_n_byte]; 
char expect[event_length]; 
char spil[event_length]; 
char clocerror[event_length*bits_n_byte]; 
char daterror[event_length*bits_n_byte]; 
long unsigned int timestamp; 
} event; 

int i, j, k, l, length, nevents; 
char **spil, **expect, **dat, **cloc, **clocerror, **daterror; 
long unsigned int *tim; 
char library[256]; 
char *runnum, *clocmode, *datmode; 

void GetPiece(char*, type, struct event*); 
void FindMode(type); 
void ErrorPiece(type); 

int main(int argc,char **argv) { 
if (argc != 2) {fprintf(stderr, "Format: ./program #_patterns\nTry again.\n");} 

for (i=0;i<256;i++) library[i]=i; 

FILE *IN = NULL; 
char *buffer = NULL; 

runnum = (char *) malloc(2); 
runnum = strncpy(runnum,argv[1],1); 
runnum[1] = '\0'; 
IN=fopen(argv[1], "r");     /*Open input file.*/ 

if (IN) 
{ 
    fseek(IN, 0, SEEK_END);     /*This finds */ 
    length = ftell(IN);     /*the length */ 
    fseek(IN, 0, SEEK_SET);     /*of the file.*/ 
    buffer = malloc(length + 2);   /*for buffer.  */ 
    fread(buffer, 1, length, IN); 
    tim = (long unsigned int *) malloc(length + 2*sizeof(long unsigned int)); 
    fread(tim, sizeof(long unsigned int), length/sizeof(long unsigned int), IN); 
    fclose(IN); 

    nevents = length/2056; 
    struct event* each_event = (struct event *) malloc(nevents*sizeof(struct event)); 

    for (i=0; i<length/sizeof(unsigned long int); i+=2056/sizeof(unsigned long int)) 
    { 
    tim[i] = __builtin_bswap32 (tim[i]); 
    tim[i]-=0x80000000; 
    //if (tim[i]<1200000000 || tim[i]>1300000000) fprintf(stderr, "Check timestamp. Either endianness, size of bytes, or size of long ints are different."); 
    each_event[i].timestamp = tim[i]; 
    } 

    clocmode = malloc(nevents); 
    datmode = malloc(nevents); 

    GetPiece(buffer, DATA, each_event); 
    GetPiece(buffer, CLOCK, each_event); 
    GetPiece(buffer, EXPECTED, each_event); 
    GetPiece(buffer, SPILL, each_event); 
    GetPiece(buffer, ALL, each_event); 
    FindMode(DATA); 
    FindMode(CLOCK); 
    ErrorPiece(DATA); 
    ErrorPiece(CLOCK); 
} 
else fprintf(stderr,"Error in file naming/opening.\n"); /*error*/ 
free (buffer); 
free (tim); 
free (runnum); 
free (clocmode); 
free (datmode); 
free (each_event); 
return 0;} 

ответ

0

Поскольку each_event объявлен внутри if { ... } блока, он выходит за рамки к тому времени, вы пытаетесь free() его. Либо освободите его в конце if { ... }, либо поместите декларацию вместе с остальными в начале main(). Однако, если вы сделаете последнее, вы, вероятно, получите предупреждения о том, что его можно использовать без инициализации, поэтому первый вариант, вероятно, лучше всего.

+0

это как раз то. Я думал, что использовать malloc и поставить эту память на кучу было достаточно, но я думаю, имя переменной уходит за пределы блока. Я узнаю что-то новое хотя бы раз в час! – jbf81tb

Смежные вопросы