Что следует за моей программой. Я создаю структуру, используя 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;}
это как раз то. Я думал, что использовать malloc и поставить эту память на кучу было достаточно, но я думаю, имя переменной уходит за пределы блока. Я узнаю что-то новое хотя бы раз в час! – jbf81tb