C Segmentation fault - saving struct in .dat file

孤人 提交于 2020-08-10 03:37:49

问题


Can someone please tell me, what causes the segementation fault in my C - code? I am trying to save a struct into a file, and calling it afterwards, following this guide. I don't see anything assigned wrongly, so I'm happy to learn what's my mistake by someone more experienced.

Here is my code, simplified:

int main(int argc, char **argv)
{
    char *key = (argc > 4) ? argv[4]: 0;
    if(0==strcmp(key, "write")){
        struct MyStruct s;
        FILE *myoutfile;
        myoutfile = fopen("file.dat","w")
        if (myoutfile == NULL) 
        { 
                    fprintf(stderr, "\nError opend file\n"); 
                    exit (1); 
        } 
        s = get_struct(argv[2]);
        fwrite(&s, sizeof(struct MyStruct), 1, myoutfile);
        fclose(myoutfile);
    }else{
    struct MyStruct t;
    FILE *myinfile;
    myinfile = fopen("file.dat", "r")
    if (myinfile == NULL) 
    { 
                fprintf(stderr, "\nError opend file\n"); 
                exit (1); 
    } 
    while (fread(&t, sizeof(struct MyStruct), 1, myinfile))
        printf("Done reading");
    }
    work_with_struct(t);
    fclose(myinfile);
}

Also, as I read in another stack overflow post, doing this:

fread(&t.one, sizeof(t.one), 1, myinfile);
fread(&t.two, sizeof(t.two), 1, myinfile);
fread(&t.three, sizeof(t.three), 1, myinfile);
            

did not work either.

EDIT: I now think i have located the problem a bit more. The first part of the function (if) works fine. What I thought was not necessary to mention first, was that in the end of the "else" I have a function that works with t. This is the one throwing the error, i believe. It works fine, when I leave out the .dat-file-part, so by just saying

t = get_struct(argv[2]);
work_with_struct(t);

which I actually want to avoid, because "get_struct" is huge. Doing it once, and working with the data in the .dat file was my solution, that I calculate it only once. My assumption now is, that putting the struct into the fstream and getting it back will somehow destroy it, or makes it somehow not-readable for work_with_struct. What I think is also worth mentioning is, that inside the struct there are three members: two char **, and one custom data type. I didn't find any other solution suggesting other ways of reading in the file.

Maybe with this explanation someone gets alerted, where the segmentation fault might come from. Thanks a lot!


回答1:


The issue is that you are passing a NULL pointer to strcmp which expects a const char*. When no arguments are passed to the program key = 0 and the program segfaults because strcmp attempts to dereference this NULL pointer.

Edit: I attempted to correct the example program to make it compile and run, here it is:

Edit 2: print content of saved struct

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct MyStruct {
    int a;
};
int main(int argc, char **argv) {
    const char *key = (argc > 4) ? argv[4] : "write";
    if (0 == strcmp(key, "write")) {
            struct MyStruct s;
            FILE *myoutfile;
            myoutfile = fopen("file.dat", "w");
            if (myoutfile == NULL) {
                    fprintf(stderr, "\nError opend file\n");
                    exit(1);
            }
            s = (struct MyStruct){ 'a' };
            fwrite(&s, sizeof(struct MyStruct), 1, myoutfile);
            fclose(myoutfile);
    } else {
            struct MyStruct t;
            FILE *myinfile;
            myinfile = fopen("file.dat", "r");
            if (myinfile == NULL) {
                    fprintf(stderr, "\nError opend file\n");
                    exit(1);
            }
            while (fread(&t, sizeof(struct MyStruct), 1, myinfile))
                    printf("Done reading\n");
            printf("%c\n", t.a);
            fclose(myinfile);
    }
}

Edit 3: After updating the description of the struct MyStruct the problem is obvious. You need to find a different way to save the struct to the file then by using fwrite since you have pointer types in it. The way you would go about that is a topic for a different question.



来源:https://stackoverflow.com/questions/63151925/c-segmentation-fault-saving-struct-in-dat-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!