2009-06-26 5 views
2
#include<stdio.h> 
#include<conio.h> 

void print(char *arr); 

void main() 
{ 
    clrscr(); 

    char temp='r'; 
    print(&temp); 
    getch(); 
} 

void print(char *arr) 
{ 
    int arrsz=sizeof(arr); 
    printf("size is %d",sizeof(arr)); 
    printf("char is %c",arr); 
} 

왜 출력이 나옵니까?이 이상한 결과를 설명해주세요.

size is 1 
char is e 

확실하게 말해야 할 것은 char is r일까요?

+1

그리고 무엇을 기대합니까? –

+2

-1 : 귀하의 질문은 무엇입니까? – hillu

+0

또한!의 연속 된 시리즈로 질문을 게시하지 마십시오. –

답변

13

당신은 값이 아닌 사용 일어나는 이해하는 디버거를 통해이를 실행하기

printf("char is %c",*arr); 

시도를 주소를 인쇄하고 무엇을 당신이 생각처럼 일이, 당신은 관찰 무엇을해야 진짜 질문을하시기 바랍니다 대신. 이렇게하면 아마도 대부분의 질문에 스스로 대답하게 될 것입니다.

그런데 한 번 인쇄 할 때 arr은 지역 변수이고 sizeof는 원래 배열의 크기를 알 수 없으므로 인쇄 크기는 4입니다. 아래 코드는이 동작을 보여 주며 그 차이점 sizeof에 관해서는 배열과 포인터 사이. 당신이하려고하면

편집 :

#include <stdio.h> 

void print(char *); 

int main(int argc, char ** argv) 
{ 
    char temp = 'r'; 
    char temp2[] = {'a','b'}; 
    char temp3[] = {'r'}; 

    print(&temp); 
    print(temp2); 
    print(temp3); 

    printf("sizeof temp is %d\n",sizeof(&temp)); 
    printf("sizeof temp2 is %d\n", sizeof(temp2)); 
    printf("sizeof temp3 is %d\n",sizeof(temp3)); 
    return 0; 
} 

void print(char * arr) 
{ 
    printf("size of arr is %d\n", sizeof(arr)); 
    printf("arr contains %c\n", *arr); 
} 

당신은 다니엘의 코멘트에 실제로 단지 추측보다는, 테스트 뭔가에 코드 덕분에 변화를 얻을 :

size of arr is 4 
arr contains r 
size of arr is 4 
arr contains a 
size of arr is 4 
arr contains r 
sizeof temp is 4 
sizeof temp2 is 2 
sizeof temp3 is 1 
+0

+1 정답 –

+1

예, 답변입니다. 정교하게하기 위해, @Chan, 타입을 동일하게 만드는 것은 항상 좋다. 만약 당신이 temp라는 char을 먼저 가지고 있다면, temp로 전달하여 char *를 가지면, 함수의 signature를 확인한다. char, char이다. *, char의 값을 출력하고 있으므로 명확하게하려면 char를 사용하십시오 this_is_a_char = * arr; 너는 다시 숯을 먹는다. 코드를 검토 할 때 변수 유형을 "따라야"하는 것이 좋습니다. –

+3

sizeof (arr)는 아키텍처에 따라 다르지만 대개 4 (포인터 크기)입니다. CHAN이 '1'의 결과를 얻는 방법을 모르겠다. char *에 대해 strlen()과 비슷한 몇 가지 컴파일러 오버로드 sizeof()를 사용합니까? –

1

문자열과 문자로 사용하려고합니다. l 종료 됨). 문자열로 사용하려면 다음과 같이 코드를 변경합니다 :

//char temp='r'; 
char* temp = "r"; 

... 

//printf("char is %c",arr); 
printf("char is %s",arr); 

가 문자로 사용하려면 다음과 같이 인쇄 문을 변경합니다 :

printf("char is %c", arr[0]); 
2

당신은에 동일한 크기를 가지고 sizeof (arr)는 arr이 가리키는 크기 인 1 크기의 문자를 반환하기 때문에 1입니다.

% c 플래그가 사용되면 printf가 char 대신 char * 주어졌다. printf ("Char is : % c", * arr)로 변경하십시오.

char *를 사용하려면 printf에 % s 플래그를 사용해야합니다. 또한 printf를 넘겨 주면 null을 종료해야합니다. 그렇지 않으면 쓰레기가 생깁니다.

+0

결과 '1'에 대한 설명이 올바르지 않습니다. 함수 내에서 'arr'은 문자 포인터 (배열이 아님)이며 다른 포인터 (일반적으로 4 또는 8, 1이 아님)와 동일한 결과를 반환합니다. –

+0

나는 왜 그것이 실제로 4를 돌려 보내지 않았는 지 궁금해하고 있었다. 내가이 설명을 올리는 유일한 이유는 원래의 포스터가 그것들이 그의 결과라고 말했기 때문이었습니다. – samoz

2

흠, 여기에 뭔가 잘못되었습니다. 나는이 결과를 믿지 않는다.

  • arrchar *sizeof(char *) != 1입니다.
  • printf에는 '\n'이 없습니다.

코드를 직접 입력 한 경우 그러지 마십시오. 복사 및 붙여 넣기가 훨씬 쉬워서 오타가 없었는지 확인할 수 있습니다. 당신이

size is 4char is 0

같은 것을 들어 왔해야 서면으로 (부분은 어떤 임의의 문자를 인쇄 할 수있다 "문자입니다.")

+0

1도 나를 당황하게했습니다. 나는 Cray에 대해 한 번에 CHAR_BITS가 32 였으므로 sizeof (char) == sizeof (short) == sizeof (int) == 1이라고 생각합니다.하지만 플랫폼은 여기에있을 법하지 않습니다. 및 void main()은 Windows를 소리 쳐줍니다. –

+0

1을주는이 크기는 수수께끼입니다. temp를 전역 데이터로두면 print()의 출력에서 ​​여전히 4가됩니다. 내가 이상한 sizeof 동작을 보았지만, 그것은 이상한 플랫폼에 있었다 :) – shodanex

관련 문제