不规则分段错误

Irregular segmentation fault

我正在尝试 运行 以下代码:

#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] = '[=10=]';
        printf("\"%s\" -> \"%s\"\n", frase, fraseout);
        return 0;
}

当我在我的 Ubuntu 15.04 上尝试 运行 时,它编译并且 运行 完美。当我尝试在 OSX Yosemite 上 运行 它时,它也可以完美地编译和 运行。但是,如果我在 CS50 VM 上编译并 运行 它,尽管编译 运行 没问题,但我在 运行 上遇到了分段错误。为什么会发生这种情况,为什么只发生在一个单数 OS 上?

代码在 j 的初始值为 0 时有效。然而,这并不是在所有(或任何)系统上都假定的,因此行为不同。初始化j.

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

argv[1] != NULL 在 C89 中是安全的,但晦涩难懂,可能不适用于不兼容的编译器。检查argc更典型。

如果不传递参数,

senha将保持未初始化状态,这可能导致稍后缓冲区溢出。

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

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

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

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

VLA 不在 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);