Staram się bardzo dziwny problem podczas próby przeczytania pliku w C.

Partnowałem ścieżkę plików za pomocą argumentu wiersza poleceń i uzyskałem rozmiar za pomocą funkcji STAT (), a to działa dobrze. Jednak po przeczytaniu pliku wszystkie moje liczby całkowite stają się arbitralnie duże, a ja nie mogę na życie mnie rozgryźć dlaczego!

Oto odpowiedni kod z mojej głównej funkcji:

int main( int argc, char *argv[] ) {
    char *filepath = argv[1];

    startaddress = strtol(argv[2], &endptra, 16);
    endaddress = strtol(argv[3], &endptrb, 16);

    int filesize = getfilesize(filepath);

    printf("Filesize is %d\n", filesize);

    unsigned char *mem = malloc( filesize );
    printf("Filesize here is %d\n", filesize);

    int size2 = filesize;
    int test3 = 18;

    printf("Size 2 set to %d\n", size2);
    printf("Test 3 set to %d\n", test3);

    // READ FILE
    loadimage(filepath, &mem, filesize);

    printf("Right after load image, file size is %d\n", filesize);

    printf("%s\n", strerror(errno));

    printf("Filesize is %d\n", filesize);
    printf("size2: %d\n", size2);
    printf("test3: %d\n", test3);

    exit(0);
}

"GetFilelize" to stosunkowo prosta funkcja, która wydaje się dobrze działać:

int getfilesize(char *path) {
    struct stat sbuffer;
    int filesize = 0;

    filesize = stat(path, &sbuffer);
    if (filesize == -1) {
        return 0;
    } else {
        return sbuffer.st_size;
    }
}

Oto funkcja LoadImage:

int loadimage(char *path, unsigned char *mem[], int size) {
    int fdin, retval;
    unsigned char buf[2048];
    int nread;

    printf("Path is: %s\n", path);
    printf("Size is: %d\n", size);

    fdin = open(path, O_RDONLY);
    printf("fdin: %d\n", fdin);

    if(fdin == -1) {
        die(strerror( errno ));
    }

    int count = 0;

    nread = read(fdin, buf, 2048);
    for(; count < nread; count++) {
        mem[count] = &buf[count];
    }

    if(nread == -1) {
        die(strerror( errno ));
    }

    retval = close(fdin);
    printf("Size is now %d\n", size);

    return 1;
}

I to jest wyjście wyniku:

Filesize is 39
Filesize here is 39

Size 2 set to 39
Test 3 set to 18

Path is: test_file.txt

Size is: 39
fdin: 3
Size is now 39

Right after load image, file size is 32765

Success
Filesize is 32765
size2: 1418855892
test3: 32765

To jest dla mnie zaskakujące i nie mogę tego zrozumieć! Jest mylące, że nawet liczby całkowite, których nie przechodzę do funkcji, są również modyfikowane. Zakładam, że gdzieś dzieje się jakieś przepełnienie pamięci, ale nie jestem przyzwyczajony do pracy w systemie plików w C.

Dzięki!

c
0
JohnnyLeek 26 październik 2020, 06:47

1 odpowiedź

Najlepsza odpowiedź

Wydaje mi się, że problem jest tutaj:

    int loadimage(char *path, unsigned char *mem[], int size) {

Argument mem powinien być tylko wskaźnikiem lub tylko tablicą, ale nie oba. Oprócz tego, robisz to samo z zmienną lokalną buf , wywołujesz go bardziej niż raz, gdy go używasz (jednak sprawa może być nieszkodliwa, nie jestem pewien). LoadImage () powinien być:

int loadimage(char *path, unsigned char *mem, int size) {
    int fdin, retval;
    unsigned char buf[2048];
    int nread;

    printf("Path is: %s\n", path);
    printf("Size is: %d\n", size);

    fdin = open(path, O_RDONLY);
    printf("fdin: %d\n", fdin);

    if(fdin == -1) {
        die(strerror( errno ));
    }

    int count = 0;

    nread = read(fdin, buf, 2048);
    for(; count < nread; count++) {
        mem[count] = buf[count]; //no need for derefencing
    }

    if(nread == -1) {
        die(strerror( errno ));
    }

    retval = close(fdin);
    printf("Size is now %d\n", size);

    return 1;
}

Następnie, dzwoniąc, nie derefrecencja MEM:

loadimage(filepath, mem, filesize);

Przepraszam, nie mam czasu, więc nie skompilowałem tego, ale dostajesz pomysł, najprawdopodobniej to problem.

0
Martin Ferrari 26 październik 2020, 04:05