2012-11-30 2 views
1

이것은 stackoverflow에 대한 첫 번째 게시물이며 규칙을 위반하거나 다시 게시하지 않기를 바랍니다. 나는 내 경고에 대한 해답을 찾았다. 유사한 인스턴스를 찾을 수는 있지만 작동하지 않습니다. 임씨는 도움을 받기를 희망합니다.C 세그먼트 화 오류, 여러 경고

hashfunction (myname)을 사용하여 해시 충돌을 찾아야합니다. 그래서 몇 가지 조사를하고 가능한 모든 문자열을 지정된 길이로 테스트하고 문자열이 발견되면이를 인쇄하는 재귀 함수를 조합했습니다. 봐.

void findCollision(char prefix[], int max_length); 

int main() { 
    printf("Finding collison\n"); 
    char blank[0] = {'a'}; 
    findCollision(blank,999); 
    printf("Press Enter to Continue"); 
    while(getchar() != '\n'); 
    return 0; 
} 

void findCollision(char prefix[], int max_length){ 
    char c; 
    char temp[sizeof(prefix)+1]; 
    for(c = 'a'; c <= 'z'; c++){ 
     strcpy(temp, prefix); 
     strcat(temp, c); 
     if(hashFunction(temp) == -408228925 && temp != 'myname'){ 
      printf("found it! --->"); 
      printf("%s", temp); 
     } 
    } 
    for(c = 'a'; c <= 'z'; c++){ 
     strcpy(temp, prefix); 
     strcat(temp, c); 
     if(sizeof(prefix) < max_length){ 
      findCollision(temp, max_length); 
     } 
    } 
} 

해시 코드 (필요한 경우 제공 할 수 있음)로 컴파일하면 이러한 오류가 발생합니다.

----------Build Started-------- 
----------Building project:[ hash - Debug ]---------- 
/home/mustbelucky/hash/hash.c 
22:2: warning: excess elements in array initializer [enabled by default] 
22:2: warning: (near initialization for ‘blank’) [enabled by default] 
34:3: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [enabled by default] 
/usr/include/string.h 
136:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char’ 
/home/mustbelucky/hash/hash.c 
35:50: warning: character constant too long for its type [enabled by default] 
35:47: warning: comparison between pointer and integer [enabled by default]  
42:3: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [enabled by default] 
/usr/include/string.h 
136:14: note: expected ‘const char * __restrict__’ but argument is of type ‘char’ 

----------Build Ended---------- 

나는 성공적으로 문제를 해결했지만 성공하지 못했다. 이견있는 사람? 이 프로젝트는 2 일 안에 끝날 예정이며 잠시 동안 실행해야한다는 생각이 들었습니다.

+0

코드 C 또는 C++이 있습니까? C처럼 보이므로 C++ 태그를 삭제해야합니다. 또한 모든 컴파일 경고문처럼 보입니다. 세분화 오류는 어디에 있습니까? – crashmstr

+4

우선, 경고를 수정하십시오! 그들은 이유가 있습니다. 두 번째로 디버거에서 프로그램을 실행해야합니다. 충돌이 발생한 위치를 파악하는 데 도움이 될뿐만 아니라 충돌 사고의 원인을 파악하는 데 도움이되는 변수를 검토 할 수 있습니다. –

+0

우선, C 언어를 배우십시오 ... 예를 들어, 'myname'은 C에서 문자열이 아니므로 "myname"을 대신 사용하십시오. 당신이 배울 필요가있는 너무 많은 세부 사항이 있습니다. 다른 사람들에게 "왜 내 코드 C가 아닌지"물어 본다는 것을 배울 수 없습니다. 이것은 본질적으로 여기서하는 일이기 때문에, 먼저 튜토리얼을 잡으십시오! – hyde

답변

2

char blank[0] = {'a'};

는 문자의 제로 길이 배열을 선언하지만은 C에 문자 []이다 고양이 온도, 길이가 1

strcat(temp, c);

할려고하는 ARAY 그것을 채울 숯. 두 인수 모두 char * 또는 char []

당신이 제공하는 코드 세그먼트 이상으로보고 된 다른 오류가 있다고 생각합니다.

편집 :

temp != 'myname'

temp'myname' 일치하는 경우 테스트하기 위해 노력하고있는 것 같다, 그러나 이것은 심지어 proably 'm'을 것입니다 컴파일하면 'myname'는 (문자 litereal이며, 온도는 문자입니다 [], 당신은 경고가 실제로는 별다른 설명이 여기에 있습니다 strcmp(temp, "myname") != 0

+1

그리고 C는 GCC의 역할에 상관없이 길이가 0 인 배열을 허용하지 않습니다. –

+0

그리고''char temp [sizeof (prefix) +1];라고 생각하면 포인터의 크기와 같은 배열 길이 +1이됩니다.'sizeof()'연산은 컴파일 타임 계산이므로, 런타임에 findCollision() 함수로 전달 된 배열의 길이. –

+0

입력 해 주셔서 감사합니다 :) – user1866949

0

를 사용하고 싶습니다.

22:2: warning: excess elements in array initializer [enabled by default] 

이것은 공간을 차지한 것보다 많은 요소를 배열에 넣었다는 것을 의미합니다.

34:3: warning: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [enabled by default] 

즉, 두 번째 인수는 포인터 여야하지만 char/int로 지정해야합니다.

다른 경고는 다른 코드에서 온 것 같습니다.

segfault에 대한 하나 이상의 이유는 sizeof이 원하는 것을 수행하지 않기 때문입니다.