2014-04-29 1 views
1

에서 나는 다음과 같은 구조체구조체 문제는 C

typedef struct rotor { 
    char characters[26]; 
    char* rotationPos; 
    char* aPosition; 
} rotor; 

을하고 난 이런 식으로 3 개 인스턴스를 만들려면 :

rotor* createRotor(char* cadeia, char* c) { 
    int aux; 
    rotor* r; 
    for (aux = 0; aux < 26; aux++) { 
     if (cadeia[aux] == NULL || strlen(cadeia) > 26) { 
      return -1; 
     } else 
      r->characters[aux] = cadeia[aux]; 
    } 
    r->characters[26] = '\0'; 
    r->rotationPos = c; 
    r->aPosition = r->characters[0]; 
    return r; 
} 
:

char cadeia3[26] = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; 
char cadeia2[26] = "AJDKSIRUXBLHWTMCQGZNPYFVOE"; 
char cadeia1[26] = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"; 

rotor* r1; 
rotor* r2; 
rotor* r3; 
r1 = createRotor(cadeia1, 20); 
r2 = createRotor(cadeia2, 20); 
r3 = createRotor(cadeia3, 20); 

createRotor 기능은 자동으로 회 전자를 생성

첫 번째 로터에서만 작동합니다 ... 콘텐츠를 확인하거나 사용하고 싶을 때마다 함수에서 다른 것들은 프로그램이 "종료"됩니다. 나에게 이상한 일은 완벽하게 일하고 다른 일을 위해 일하는 것이 아닙니다.

내가 뭘 잘못하고 있니?

+0

왜'char * c' 인수에'20' 값을 전달합니까? – lurker

+0

내게 이상한 것은 그것이 전혀 작동한다는 것입니다. 그의 [답변] (http://stackoverflow.com/a/23376410/15168)에서 [amit] (http://stackoverflow.com/users/572670/amit)으로 진단 된대로, 당신은 로터를위한 공간을 할당하지 않습니다 , 첫 번째 호출에서 충돌이 발생하지 않는다는 것이 놀랍습니다 (또는 불운이되어 충돌이 발생하지 않음). 하지만 그것은 정의되지 않은 동작과 관련된 문제입니다. 일어날 일을 예측할 수 없습니다. 컴파일러 경고에 더 많은주의를 기울여야합니다. 그것이 당신에게 말해야 할 모든 종류의 것들이 있습니다. 컴파일러는 C보다 C에 대해 더 많이 알고 있음을 기억하십시오. –

답변

3

나에게 정의되지 않은 동작처럼 보인다.

rotor에 필요한 메모리를 (동적으로) 할당하지 않습니다. createRotor() 함수는 임의의 정크 주소 (즉, r 값)에 데이터를 저장하고 액세스하려고합니다. 프로그램에 할당 된 주소로 r을 초기화하지 마십시오. 당신이, 상수 ("20")처럼, "문자의 C"로 매개 변수를 정의하지 "의 char *에 c"바이트를 사용하는 경우

1) :

2
char cadeia3[26] = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; 

문자열 리터럴은 이미 26 자 길이입니다. 즉, 배열에 널 종결 자의 여유 공간이 없습니다. 따라서이 전화는 다음과 같습니다.

strlen(cadeia); 

은 정의되지 않은 동작을 호출합니다.

사용 :

char cadeia3[27] = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; 

또는

char cadeia3[] = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; 
+0

하지만 배열은 [0]에서 [26]까지 27 개 위치가됩니까? – MMrj

+0

@MMrj - _ 그러나 배열은 [0]에서 [26]까지 27 개 위치로 이동합니까? _ 예.배열 [n] 인덱스 값은 항상 0에서 n-1까지입니다 (이 경우 0에서 26) – ryyker

0

세 가지 변경 사항을 제안

rotor* createRotor(char* cadeia, char* c) 
당신의 문자열) 26 자 사이 ... 다음 문자 배열이 (적어도 있어야합니다 27 개 문자 인 경우

2) 더 중요한 :

typedef struct rotor { 
    char characters[27]; 
    char* rotationPos; 
    char* aPosition; 
} rotor; 
... 
char cadeia3[27] = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; 

3) 가장 중요한 있는지 확인합니다을 ALLOCATE "회 전자"가 어딘가에 구조화되어 있습니다.