2016-12-03 22 views
1

Cでシーザー暗号プログラムを実行しています。私はすでにプログラムを実行しましたが、実行中にエラーが発生することがあります。mallocとreallocでエラーを取得する

コード:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 


int main() { 

    int size=10,al=0; 
    int sizek=10,ak=0; 
    char *str= (char *) malloc(size+5); 
    if (str == NULL) { 
     printf("malloc error\n"); 
     return 0; 
    } 
    char *strIni=str; 
    char *str2= (char *) malloc(sizek+5); 
    if (str2 == NULL) { 
     printf("malloc error\n"); 
     return 0; 
     } 
    char *str2Ini=str2; 
    //char a,b; 
    while ((str[al]=getchar())!='\n') { 
     if (al==size-2){ 
      size=size+10; 
      char *strR=(char *) realloc(str,size); 
      if (strR == NULL) { 
       printf("malloc error\n"); 
       return 0; 
      } 
      printf("DDDD\n"); 
      strIni=strR; 
     } 
     al++; 
    } 
    printf("Or1 %d Al %d\n",strlen(strIni),al); 
    str[al]='\0'; 
    printf("Af %d Al %d\n",strlen(strIni),al); 


    while ((str2[ak]=getchar())!='\n') { 
     if (ak==sizek-2){ 
      sizek=sizek+10; 
      char *str2R=(char *) realloc(str2,sizek+5); 
      if (str2R == NULL) { 
       printf("malloc error\n"); 
       return 0; 
      } 
      printf("CCCC\n"); 
      str=str2R; 
     } 
     ak++; 
    } 
    printf("Or2 %d Ak %d\n",strlen(str2Ini),ak); 
    str2[ak]='\0'; 
    printf("Af2 %d Ak %d\n",strlen(str2Ini),ak); 


    printf("Str1 %s\n",strIni); 
    printf("Str2 %s\n",str2Ini); 

    int sDup=1; 
    int dif[strlen(str2Ini)]; 
    int* dup=(int *) malloc(sizek); 
    int max[(sDup)]; 
    int rot[2]={0,0}; 

    for (int i=0;i<(strlen(str2Ini));i++){ //pokud AA - aa -xy) 
     if (str2Ini[i]<123&&str2Ini[i]>96 &&strIni[i]<91&&strIni[i]>64){ 
      dif[i]=(int)str2Ini[i]-((int)strIni[i]+6); 
     } else if (strIni[i]<123&&strIni[i]>96 &&str2Ini[i]<91&&str2Ini[i]>64){ 
      dif[i]=(int)strIni[i]-((int)str2Ini[i]+6); 
     } else if (strIni[i]<123&&strIni[i]>96 &&str2Ini[i]<123&&str2Ini[i]>96) { 
      dif[i]=(int)strIni[i]-((int)str2Ini[i]); 
     } else if (strIni[i]<91&&strIni[i]>64 &&str2Ini[i]<91&&str2Ini[i]>64){ 
      dif[i]=(int)strIni[i]-((int)str2Ini[i]); 
     } 
     if (dif[i]<0) { 
      dif[i]=-1*dif[i]; 
     } 
     printf("Dif%d: %d\n",i,dif[i]); 
    } 
    for (int i=0;i<strlen(strIni);i++) { 
     int l=0; 
     for (int j=0;j<sDup;j++) { 
      if (dif[i]==dup[j]) { 
       max[j]++; 
       l++; 
       break; 
      } 
     } 
     if (l==0){ 
      dup[sDup-1]=dif[i]; 
      max[sDup-1]=0; 
      max[sDup-1]+=1; 
      sDup++; 
     } 
    } 
    for (int h=0;h<1;h++){ 
     for (int i=0;i<(sDup-1);i++) { 
      if(rot[0]>max[i]) { 
       rot[0]=rot[0]; 
      } else { 
       rot[0]=max[i]; 
       rot[1]=dup[i]; 
      } 
     } 
    } 
    for (int i=0;i<strlen(strIni);i++){ 
     if (((int)strIni[i]>64 && (int)strIni[i]<91) || ((int)strIni[i]>96 && (int)strIni[i]<123)){ 
      continue; 
     } else { 
      fprintf(stderr, "Error: Chybny vstup!\n");/*free(strIni);free(str2Ini);free(dup); */return 100; 
     } 
    } 
    for (int i=0;i<strlen(strIni);i++){ 
     if (((int)strIni[i]>64 && (int)strIni[i]<91) || ((int)strIni[i]>96 && (int)strIni[i]<123)){ 
      if (strlen(strIni)==(strlen(str2Ini))) { 
       if ((int)strIni[i]+(int)rot[1]>90 && (int)strIni[i]<91) { 
        strIni[i]=strIni[i]+6+(int)rot[1]; 
       } else if ((int)strIni[i]+(int)rot[1]>122 && (int)strIni[i]<123) { 
        strIni[i]=(strIni[i]-58+rot[1]); 
       } else if ((int)strIni[i]>64 && ((int)strIni[i]+rot[1])<91) { 
        strIni[i]=strIni[i]+rot[1]; 
       } else if ((int)strIni[i]>96 && ((int)strIni[i]+rot[1])<123) { 
        strIni[i]=strIni[i]+rot[1]; 
       } else { 
        strIni[i]='#'; 
       } 
       //printf("%c ",strIni[i]); 
      } else {fprintf(stderr, "SSError: Chybna delka vstupu!\n");/*free(strIni);free(str2Ini);free(dup);*/ return 101; 
      } 
    } else { 
    fprintf(stderr, "Error: Chybny vstup!\n");/*free(strIni);free(str2Ini);free(dup);*/ return 100; 
    } 
    } 
    str[al]='\0'; 
    printf("Rot: %d\n",rot[1]); 
    printf("String: %s\n",strIni); 
    // free(strIni);free(str2Ini);free(dup); 
    //freeIni, dup 
    ///posun o 42pismen 
    return 0; 
} 

、それはまた、私にエラーを与えていたので、私は、割り当てられた領域を解放コメントしました。私は後でそれに対処したいと思った。

最後のprintfsは、このコードが何をするのか、どこで停止するのかを知るためのものです。

Sipmly code:私はstrで2文字列、getcharでstr2を取得します。 (大きさ(10)-2)より大きければサイズ+ 10を割り当てます。それから、私は文字列で作業し、文字の違いを作ります。そして、私は最もよく使われている違いを探し、それを最終的な回転として使います。その後、計算された回転を使って最初の文字列を回転させます。

入力:

qrstuvwxyzABCDEFGHIJKLMNnop
aHcQefghWjdlmnopqostuvTxyYZ

出力:

DDDD
DDDD
Or1 19 Al 27
Af 19 Al 27

エラー:

prog: malloc.c:2842: mremap_chunk: Assertion `((size + offset) & (_rtld_global_ro._dl_pagesize - 1)) == 0' failed.

Excpected出力:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS

+0

*あなたのコードのどの行が参照していますか?スタックトレースをチェックする必要があります。 –

+0

割り当てられたメモリの境界から書き出すと、通常はエラーが発生します。おそらく、[Valgrind](http://valgrind.org/)のようなメモリデバッガでエラーを見つけるのに時間がかかるかもしれません。 –

+0

ところで、 'getchar'が' EOF'を返すとどうなりますか? –

答えて

2

最初のループではstrを再割り当てしますが、新しい値をstrに戻すことはできませんが、を実行してにアクセスすると、後でstrにアクセスします。 reallocを移動した場合(許可されている場合)、問題が発生します。第2のループで同様のもの(str2)。ここで

0

char *strR=(char *) realloc(str,size); 

あなたがstrの再配置が、strRに新しいメモリ・セグメントを保存しています。 reallocはデータを移動する必要があるため、strポインタが無効な可能性があります。

+1

キャストは必要ありません - それは悪いです - http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-mallocを参照してください –

関連する問題