Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 加密程序中的分段错误_C - Fatal编程技术网

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()
)。