2009-04-25 4 views
3

저는 C에서 6 비트 숫자를 취하고 처음 3 비트를 처리하고 그 결과에 따라 "r", "w"또는 "o"를 반환하는 간단한 함수를 작성합니다.C에서 "경고 : 리턴은 캐스트없이 포인터에서 정수를 만듭니다"는 의미는 무엇입니까?

그러나 컴파일 할 때 '반환 값은 캐스트없이 포인터에서 정수가됩니다.'라는 경고가 나타납니다. 그런 다음 프로그램을 실행할 때 함수가 이상한 문자를 반환한다는 것을 알게되었습니다.

여기에 무슨 일이 일어나고 있습니까? 미리 감사드립니다.

여기에 내 함수이다 :

char 
readorwrite(int opcode) 
{ 
    if (opcode >> 3 == 4) { 
     return "r"; 
    } else if (opcode >> 3 == 5) { 
     return "w"; 
    } else { 
     return "o"; 
    } 
} 
+3

닐 버터 워스는 지금 삭제 대답 지적 숯불 'O'를 반환해야 할 때 문자열이 "O"저장되어있는 메모리의 위치 즉, 포인터를 반환 당신이해야 시프트 또는 AND 또는 OR와 같은 비트 연산자를 평등과 같은 비교와 혼합하는 것에 매우주의하십시오. 시프트 연산자는 비교보다 우선 순위가 높습니다. 그러나 우선 순위 테이블로 이동하여 검사를 해봐야했는데 C에서 초보자가 아니 었습니다. 비트 마스킹과 비트 시프 팅을 수행 할 때 특별한 문제가 있습니다. 컴파일러가 의도 한대로 정확하게 처리 할지라도, 코드를 검토를 위해 나에게 제시했는지, 나는 시프트 연산 주위에 여분의 괄호를 요청할 것이다. –

답변

18

문제는 "R", "w"과 "O"는 실제 유형 CHAR [] 또는 숯불 * 것을 의미 문자열 상수라는 것이다. 즉, 함수가 실제로 0으로 끝나는 문자열에 대한 포인터를 반환하고 있음을 의미합니다. 단일 문자의 경우 'r', 'w'및 'o'를 대신 사용해야합니다.

4

당신은 const char *, 당신이