2015-05-28 3 views
1

Я пытаюсь написать и прочитать простой узел struct в файле juantest.txt. Но я получаю следующую ошибку, когда проверяю этот код с помощью valgrind. Не могли бы вы помочь исправить это, пожалуйста? Что здесь произошло?Valgrind Error Struct

==25771== 4 errors in context 99 of 100: 
==25771== Invalid read of size 4 
==25771== at 0x4EA5973: fread (libioP.h:905) 
==25771== by 0x40080D: validation_read (in /home/grados-sanchez/git/merkle-codigos-C/test) 
==25771== by 0x40087E: node_read (in /home/grados-sanchez/git/merkle-codigos-C/test) 
==25771== by 0x400B18: main (in /home/grados-sanchez/git/merkle-codigos-C/test) 
==25771== Address 0x51fc120 is 224 bytes inside a block of size 568 free'd 
==25771== at 0x4C2BDEC: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==25771== by 0x4EA4AE4: [email protected]@GLIBC_2.2.5 (iofclose.c:85) 
==25771== by 0x400ACC: main (in /home/grados-sanchez/git/merkle-codigos-C/test) 
==25771== 
==25771== 
==25771== 4 errors in context 100 of 100: 
==25771== Invalid read of size 4 
==25771== at 0x4EA5951: fread (libioP.h:905) 
==25771== by 0x40080D: validation_read (in /home/grados-sanchez/git/merkle-codigos-C/test) 
==25771== by 0x40087E: node_read (in /home/grados-sanchez/git/merkle-codigos-C/test) 
==25771== by 0x400B18: main (in /home/grados-sanchez/git/merkle-codigos-C/test) 
==25771== Address 0x51fc124 is 228 bytes inside a block of size 568 free'd 
==25771== at 0x4C2BDEC: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==25771== by 0x4EA4AE4: [email protected]@GLIBC_2.2.5 (iofclose.c:85) 
==25771== by 0x400ACC: main (in /home/grados-sanchez/git/merkle-codigos-C/test) 

Вот мой код

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

#define id_lenght 6000 
typedef unsigned char * ustring; 
typedef struct { 
    ustring ustr; 
    int height; 
    char id[id_lenght]; 
} node; 

int validation_read(void * ptr_var, size_t sizeof_datatype, int num, 
    FILE * ptr_file) { 
    if (fread(ptr_var, sizeof_datatype, num, ptr_file) <= 0) { 
     printf("Error reading file"); 
     return 1; 
    } 
return 0; 
} 

void node_read(FILE * node_ptr, node * n, int r) { 
    int i; 
    validation_read(n->id, sizeof(unsigned char), id_lenght, node_ptr); 
    validation_read(&(n->height), sizeof(int), 1, node_ptr); 
    validation_read(n->ustr, sizeof(unsigned char) * (r + 1), 1,node_ptr); 
} 

void node_init(node * n, int r) { 
    memset(n, 0, sizeof(node)); 
    n->ustr = malloc((r + 1) * sizeof(unsigned char)); 
    memset(n->ustr, 0, (r + 1)); 
    n->height = -1; 
    memset(n->id,0,id_lenght); 
} 


void node_write(FILE * node_ptr, node * n, int r) { 
    int i; 
    char newid[id_lenght]; 
    memset(newid,0,id_lenght); 
    sprintf(newid,"%s",n->id); 
    fwrite(newid, sizeof(unsigned char), id_lenght, node_ptr); 
    fwrite(&(n->height), sizeof(int), 1, node_ptr); 
    fwrite(n->ustr, sizeof(unsigned char) * (r + 1), 1,node_ptr); 
} 


void node_destroy(node * n) { 
    free(n->ustr); 
    n->height = -1; 
} 

int main() { 
    FILE * ptr = fopen("juantest", "w+"); 
    int r = 64/8; 
    node in; 
    node_init(&in, r); 
    node_write(ptr, &in, r); 
    node_destroy(&in); 
    fclose(ptr); 
    FILE * ptr1 = fopen("juantest", "r"); 
    node in1; 
    node_init(&in1, r); 
    node_read(ptr, &in1, r); 
    node_destroy(&in1); 
    fclose(ptr1); 
} 
+2

С 'valgrind', если вы видите' Invalid Распознать размера x' или 'Invalid записи размера x', 99% времени, вы либо пытались читать или писать за пределами допустимого диапазона какого-либо массива или структуры, или вы попытались прочитать или записать неверный/недопустимый указатель. Иногда требуется тщательно выбирать код, чтобы найти, но редко (если вообще когда-либо) ошибочно «valgrind». Компиляция с параметрами генерации символов ('-g' в linux) и' valgrind' будет содержать номер строки, где происходит недопустимое чтение или запись. –

ответ

1
node_read(ptr, &in1, r); 

ptr уже закрыт. Я думаю, что вы имели в виду, что быть:

node_read(ptr1, &in1, r); 
Смежные вопросы