不规则分段错误
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);
我正在尝试 运行 以下代码:
#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);