从文件读取时导致分段错误的联合

时间:2018-06-14 14:01:15

标签: c segmentation-fault unions

我对c很新,并不完全确定文件操作是如何工作的。我设法做到这一点,但我一直遇到分段错误,我可以弄清楚如何修复它是我的代码:

int main() {
    int c;
    char str[50];
    FILE *file;
    file = fopen("encrypt.txt", "r+");
    if (file) {
        while ((c = getc(file)) != EOF){
                fseek(file, ftell(file)-1, SEEK_SET);
            char d = getc(file);
            union shift sh;
            sh.str = d; //It worked until here
            sh.i = sh.i+5;
            str[c] = sh.str;
            printf("%c", str[ftell(file)-1]);
        }
        fclose(file);
    }
}

union shift {
    int i; 
    float f;
    char str;
};

我试图从文件ecrypt.txt中读取并使用union将char更改为int。然后它将int移动5并将其变回char,将其保存在str

编辑:我正在查看第一个while循环,并假设c是一个int。我用ftell(文件)-1替换了c

2 个答案:

答案 0 :(得分:0)

不确定您想要实现的目标,但请查看str的声明:

char str[50];

现在分配c

    while ((c = getc(file)) != EOF){

然后分配到str[c]

    str[c] = completely_irrelevant;

如果c > 49(这是1的代码)您正在访问str越界,这就是为什么如果您的文件包含,例如,您遇到分段错误的原因代码高于49的字母。

为避免这种情况,请将其设为

char str[255];

(一旦修复,您可能需要对代码做更多的工作,不,union的使用与当前错误无关)

答案 1 :(得分:0)

有问题的陈述是

str[c] = sh.str; /* it cause UB if c is greater than 49 */

当你c = getc(file)宣布c仅为49字符的数组str时,50的值大于char str[50]; 1}}。为避免这种情况,请将str声明为

char str[255] = ""; /* initialize it */

当您执行sh.i+5; sh.i值是什么时?你没有union变量。像下面一样初始化它以避免未定义的行为。

union shift sh = { 0 };