C 加密程序中的分段错误
我正在尝试制作一个简单的加密程序,没有什么数学方面的内容,但为了更进一步,我需要知道是什么原因导致我的程序出现分段错误。我试图简化我的代码C 加密程序中的分段错误,c,C,我正在尝试制作一个简单的加密程序,没有什么数学方面的内容,但为了更进一步,我需要知道是什么原因导致我的程序出现分段错误。我试图简化我的代码 char * createAlfabeth(void) { char * alfa = NULL; strcpy(alfa, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); int i, j=1, k=0; for(i=0; i<(sizeof(alfa)/sizeof(char)); i++, j+=3
char *
createAlfabeth(void)
{
char * alfa = NULL;
strcpy(alfa, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
int i, j=1, k=0;
for(i=0; i<(sizeof(alfa)/sizeof(char)); i++, j+=3)
{
if(j>25)
{
j=1+(k++);
}
swap(alfa, i, j);
}
return alfa;
}
char *
codificator(char *mess, const char *alfa)
{
int key[]=PRIVATE_KEY;
char *newmess=NULL;
int i, j;
for(i=0, j=0; mess[i]!='\0'; i++, j++)
{
if(j>(sizeof(key)/sizeof(key[0])))
{
j=0;
}
newmess[i]=alfa[i+key[j]];
}
return newmess;
}
int
main(void)
{
char *alfa=crearAlfabeto();
printf("write your message :\n");
char message[20];
scanf("%s", message);
char *codified=codificator(message, alfa);
printf("The codified message is: %s \n", codified);
return 0;
}
char*
createAlfabeth(无效)
{
char*alfa=NULL;
strcpy(alfa,“ABCDEFGHIJKLMNOPQRSTUVWXYZ”);
int i,j=1,k=0;
对于(i=0;i25)
{
j=1+(k++);
}
掉期(阿尔法,i,j);
}
返回阿尔法;
}
煤焦*
编目器(字符*混乱,常量字符*阿尔法)
{
int key[]=私钥;
char*newmess=NULL;
int i,j;
对于(i=0,j=0;mess[i]!='\0';i++,j++)
{
如果(j>(sizeof(键)/sizeof(键[0]))
{
j=0;
}
newmess[i]=alfa[i+键[j]];
}
返回newmess;
}
int
主(空)
{
char*alfa=crearAlfabeto();
printf(“写下您的信息:\n”);
字符消息[20];
scanf(“%s”,消息);
字符*编码=编码器(消息,阿尔法);
printf(“已编码的消息为:%s\n”,已编码);
返回0;
}
已解决:发布备忘录
我用下面ouah和askmish的建议解决了这个问题(感谢他们)。对于你们谷歌搜索这个答案的人来说,我想说这个问题和堆处理有关。由于我没有为后来声明或初始化的字符串存储足够的空间,因此没有为它们分配足够的内存
这是malloc、realloc、calloc(和free)函数的用途。分段错误来自于我试图超出代码中为数据段分配的内存。每个程序都为代码(代码段)和数据(数据段)分配了内存,如果没有用c语言明确地告诉您将在数据段中存储多少内存,则会出现此错误。这是我对所读内容的理解,如果有更具洞察力的人想对此发表评论,请
char * alfa = NULL;
strcpy(alfa, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
您需要为数组对象分配内存
例如:
char *alfa = malloc(sizeof "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
/* check that malloc succeeds here */
strcpy(alfa, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
除了乌阿的回答之外: 而不是在
编目器中:
char *newmess=NULL;
int i, j;
for(i=0, j=0; mess[i]!='\0'; i++, j++)
{
if(j>(sizeof(key)/sizeof(key[0])))
{
j=0;
}
newmess[i]=alfa[i+key[j]];
}
写下:
char *newmess=NULL;
int i, j;
newmess = malloc(strlen(mess)*sizeof(char)); //This line could be written in many ways
if(newmess != NULL) //Handle memory allocation failing.
{
for(i=0, j=0; mess[i]!='\0'; i++, j++)
{
if(j>(sizeof(key)/sizeof(key[0])))
{
j=0;
}
newmess[i]=alfa[i+key[j]];
}
}
在将指针与字符串一起使用之前,请确保为指针分配内存。否则将出现Seg故障
。
您必须使用mine和ouah的修复来消除分段错误。消除显式malloc/strcpy:char*alfa=strdup(“ABCDEFGHIJKLMNOPQRSTUVWXYZ”)
不能对指针使用sizeof
来获取指针指向的元素数。可以对数组使用sizeof
,但数组不是指针。对于char*
,您需要通过其他方式存储或检索字符串的长度(例如,通过另一个字符串上的strlen()
)。