2012-02-21 2 views
7

다음 코드는 64 비트와 32 비트에서 다르게 작동하므로 내 코드를 포팅하는 데 문제가 있습니다.64 비트 컴퓨터의 strtok

32 bit: 
size of char * = 4 and size of strtok return val = 4 

64 bit: 

size of char * = 8 and size of strtok return val = 4 

strtok를의 남자 페이지가 말한다 : 64 비트 컴퓨터에 숯불 * 인쇄로 8 바이트 있어야하는데

#include <string.h> 

    char *strtok(char *str, const char *delim); 

RETURN VALUE 
     The strtok() and strtok_r() functions return a pointer to the next token, or NULL if there are no more tokens. 

char * tmp = "How are you?"; 
printf("size of char * = %ld and size of strtok return val = %ld \n",sizeof(char *),sizeof(strtok(tmp," "))); 

다음은 출력됩니다. 그렇다면 왜 strtok은 64 비트 머신에서 4 바이트 char 포인터를 반환합니까 ??

감사

+2

이러한 결과를 얻으려면 어떤 컴파일러를 사용하고 있습니까? – Joel

+5

''을 잊어 버렸습니까? 그렇다면 컴파일러는 전통적인 기분에있을 수 있으며, 알 수없는 함수에 대해서는 int 형을 반환합니다. –

+2

'gcc-4.5.real (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2'에서 확인되었습니다. 미친. – sarnold

답변

9

당신은 #include <string.h>를 잊어 버렸습니다.

이로 인해 int의 기본 반환 유형이 컴파일러에 의해 유추됩니다. # 헤더 파일을 포함하여 올바른 프로토 타입이 범위로 끌어옵니다.

이렇게하면 gcc의 문제가 해결됩니다. 그것이 당신을 위해하지 않는다면, 당신은 어떤 컴파일러를 사용하고 있습니까?

+1

선언되지 않은 함수를 호출하려고하면 컴파일러는 적어도 경고해야합니다. 그렇지 않은 경우 경고 수준을 높이는 방법을 찾아야합니다. (암시 적 int 규칙은 1999 ISO C 표준에 의해 언어에서 제거되었습니다.) 그리고 주석에서 OP는 그가'string.h'; 그렇다면 그것은 문제가 아닙니다. –

+0

문제가 생겨서 죄송합니다. 내 파일 계층 구조에서 string.h 사본을 가지고있다. string.h를 삭제하고 gcc가 기본 경로를 사용하도록했습니다. 이제 작동합니다. @ Daniel, Clark : 힌트를 주셔서 감사합니다 !! – ntalli

+0

@ntalli : include 지시어는'#include ', * not *'#include "string.h"'이어야합니다; 자신의 파일 계층 구조에서'string.h' 헤더를 가져 오는 것을 피해야합니다. 그리고 제 대답에 설명 된대로'printf' 형식 문자열을 고쳐야합니다. 더 나은 경고를 얻으려면'gcc -std = c99 -pedantic -Wall -Wextra'로 컴파일하십시오. (C99보다는 C89/C90 코드를 원한다면'-std = c99'를'-ansi'로 대체하십시오.) –

3

는에 tmp 가리키는 문자열 리터럴 개조 것이기 때문에 정의되지 않은 동작이 발생할 것 strtok(tmp, " ")를 호출 -하지만 sizeof의 피연산자 이후 평가되지 않습니다 (여기에 적용되지 않습니다 하나 개를 제외하고), 그는 아니다 발행물.

실제 문제는 값을 "%ld" 형식으로 인쇄하려고 시도하는 것입니다. unsigned long 인수가 필요합니다.

구현이 지원하는 경우

하는 size_t 인수에 대한 올바른 형식 (C99 추가) "%zu"입니다 :

printf("size of char * = %zu and size of strtok return val = %zu\n", 
     sizeof(char *), sizeof(strtok(tmp," "))); 

그렇지 않으면, 명시 적으로 적절한 크기로 인수를 변환합니다. size_t은 서명되지 않은 유형이므로 "%lu"을 사용합니다.

#include <stdio.h> 
#include <string.h> 
int main(void) { 
    char * tmp = "How are you?"; 
    printf("size of char * = %lu and size of strtok return val = %lu\n", 
      (unsigned long)sizeof(char *), 
      (unsigned long)sizeof(strtok(tmp," "))); 
    return 0; 
} 

편집이 : 다른 대답에 영업의 코멘트가 string.h을 나타냅니다

printf("size of char * = %lu and size of strtok return val = %lu\n", 
     (unsigned long)sizeof(char *), (unsigned long)sizeof(strtok(tmp," "))); 

여기에 어떤 C89 이상 구현에 예상되는 결과를 생성해야 완전한 자체에 포함 된 프로그램입니다 헤더가 문제였다. 를 발생하지 않는 한 그이지만 분명히 그는

#include <string.h> 

나는 그것이 OP의 코드를 수정해야 또 다른 문제를 설명하기 때문에 여기에이 대답을 떠날거야보다

#include "string.h" 

오히려했다 관찰 된 증상. 및 컴파일러에서 잘못된 string.h 헤더 파일을 선택했습니다.

+0

여기에 적용되지 않는 'sizeof()'에 대한 예외를 알고 싶습니다. :) – sarnold

+0

나는 전달 형식이 64 비트 정수라고 예상 할 때 잘못된 형식 지정자로 인해 값 8이 4로 인쇄 될 것이라고 생각하지 않습니다. –

+0

@sarnold 가변 길이 배열? –

관련 문제