不规则分段错误

时间:2015-09-24 21:19:53

标签: c linux ubuntu segmentation-fault cs50

我试图运行以下代码:

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

int main(int argc, char const *argv[]) {
        /* code */
        char senha [256];
        if (argv[1] != NULL)
        {
                strcpy(senha, argv[1]);
        }
        char frase [256];
        printf("Insira a frase: \n");
        scanf("%s", frase);
        int sizeS = (int)strlen(senha);
        int sizeF = (int)strlen(frase);
        char fraseout [sizeF+1];
        int i;
        int j;
        for (i=0; i<=sizeF-1; i++)
        {
                if(j>=sizeS)
                {
                        j=0;
                }
                int valF = (int)frase[i];
                int valS = (int)senha[j];
                valF = 32 + ((valF - 32) + (valS - 32)) % (128-32);
                fraseout[i] = (char)valF;
                j++;
        }
        fraseout[sizeF] = '\0';
        printf("\"%s\" -> \"%s\"\n", frase, fraseout);
        return 0;
}

当我尝试在我的Ubuntu 15.04上运行它时,它会编译并运行完美。当我尝试在OSX Yosemite上运行它时,它也可以编译并运行完美。但是,如果我在CS50 VM上编译并运行它,尽管编译运行正常,我在运行时会出现Segmentation Fault错误。为什么会发生这种情况,为什么只能在一个单一的操作系统上发生?

2 个答案:

答案 0 :(得分:3)

当j具有初始值0时,代码起作用。但是,不应在所有(或任何)系统上假设,因此行为不同。初始化j。

答案 1 :(得分:2)

可能的问题,删除了不相关的行。未初始化的可能是你的问题。

argv[1] != NULL对C89是安全的,但是不明确,可能不适用于不合规的编译器。检查argc更为典型。

如果未传递参数,则

senha未初始化,这可能会导致缓冲区溢出。

        char senha [256];
        if (argv[1] != NULL)
                strcpy(senha, argv[1]);

不检查缓冲区的大小以进行输入,请使用scanf("%255s", frase);

不检查scanf的返回值,frase如果失败将保持未初始化状态,这可能会导致缓冲区溢出。

        char frase [256];
        scanf("%s", frase);

VGA不在C89中,但在C99中并作为GNU C89的扩展提供,这是gcc默认使用的。这可能无法使用严格的C89编译器进行编译。

        int sizeF = (int)strlen(frase);
        char fraseout [sizeF+1];

未初始化。

    int j;

此计算可能会产生",导致输出报价不正确。

                valF = 32 + ((valF - 32) + (valS - 32)) % (128-32);
                fraseout[i] = (char)valF;
        printf("\"%s\" -> \"%s\"\n", frase, fraseout);