2016-12-03 3 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; 
} 

I 주석 그것은 또한 나에게 오류를 제공했기 때문에 할당 된 공간을 확보. 나는 나중에 그것을 다루기를 원했다.

모든 printfs는 마지막 코드를 사용하여이 코드가 무엇을하는지, 어디에서 멈출 지 알 수 있습니다.

Sipmly 코드 : getchar를 사용하여 str과 str2에 2 문자열을 얻습니다. (Var al과 ak는 보통 i의 insted입니다.) 그런 다음 (size (10) -2)보다 크면 size + 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을 이동하면 (허용 된 경우) 문제가 발생할 수 있습니다. 두 번째 루프에서 비슷한 점은 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을 참조하십시오. –