加密程序中的分段错误

时间:2012-10-19 23:51:24

标签: 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)
    {
        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;
 }

已解决:POST MEMORANDUM

我用下面的ouah和askmish解决了问题(感谢两者)。对于那些谷歌搜索到这个答案的人,我想说这个问题与堆处理有关。由于我没有为后面声明或初始化的字符串存储足够的空间,因此没有足够的内存分配给它们。

这是malloc,realloc,calloc(和free)函数的目的是处理。分段错误来自于我试图超越代码中数据段的分配内存。每个程序都为代码(代码段)和数据(数据段)分配了内存,并且没有明确告诉你要在数据段中存储多少,就会出现这个错误。这是我对我所读过的内容的理解,如果有更多洞察力的人想对此发表评论请做..

2 个答案:

答案 0 :(得分:4)

 char * alfa = NULL;
 strcpy(alfa, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");

您需要为数组对象分配内存。

例如:

 char *alfa = malloc(sizeof "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
 /* check that malloc succeeds here */
 strcpy(alfa, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");

答案 1 :(得分:1)

除了ouah的回答: 而不是codificator中的这个:

 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 Faults。 你必须使用我和ouah的修复来消除分段错误。