2017-02-02 1 views
2

답장을 보내 주셔서 감사합니다. 모두가이 기능의 작동 방식을 이해하는 데 도움이되었습니다.친구가 나에게 이해하지 못하는 스 니펫을 보냈습니다. 이게 어떻게 작동합니까?

친구가 나에게이 코드를 보냈다. 나는 보통 C 언어로 일하지 않는다. 그러나 이것은 나의 관심을 자극했다. 나는 어떤 일이 벌어지고 있는지 이해하려고 애 쓰면서 시간을 보냈지 만, 결국 나는 그것을 완전히 파악할 수 없었다. 나는 그것이 배열의 데이터 (그래, 내가 아는을 : \) 인쇄 단지 멋진 방법이라고 생각 처음

void knock_knock(char *s){ 
while (*s++ != '\0') 
    printf("Bazinga\n"); 
} 

int main() { 
int data[5] = { -1, -3, 256, -4, 0 }; 
knock_knock((char *) data); 
return 0; 
} 

: 여기 코드는,하지만 난 그것을하지 않았다봤을 때 나는 놀랐습니다 'Bazinga'를 5 번 인쇄했는데 8 번 인쇄했습니다. 물건을 검색하여 포인터로 작업하고 있다고 생각했는데 (C의 경우 전체 아마추어), 여전히 이유를 파악할 수 없었습니다. 8. 조금 더 검색하여 찾았습니다. out 포인터는 일반적으로 C에서 8 바이트의 길이를 가지고 있으며, sizeof (s)를 루프 전에 인쇄함으로써 확인했다. 그리고 확실히 8이었다. 나는 이것이 포인터라고 생각했다. 그래서 그것은 Bazinga를 8 번 인쇄 한 것이 합리적입니다. 또한 Bazinga를 인쇄 문자열로 사용하는 이유는 나에게 분명했습니다. 배열의 데이터는 산만 함을 의미했습니다. 그래서 배열에 더 많은 데이터를 추가하려고 시도했지만, 확실히 8 번 인쇄를 계속했습니다. 그런 다음 배열의 첫 번째 숫자 인 -1을 변경하여 데이터가 실제로 무의미한 지 여부를 확인하고 이것이 혼란 스러웠던 곳입니다. 더 이상 8 번 인쇄하지 않았지만 한 번만 인쇄했습니다. 확실히 배열의 데이터는 미끼가 아니었지만 나에게있어서 무슨 일이 일어나는지 알 수 없었습니다.

+1

이 함수는 char 포인터 (1 바이트)를 사용하여 int 값 (4 바이트)을 가리키고 있습니다 ..... – LPs

+1

'printf ("% 08X - % 08X - % 08X \ n", data [0 ], data [1], data [2]);'함수 호출 전에 ... – LPs

+1

정의되지 않은 동작을 호출하지 않습니까? – George

답변

6

다음 코드

#include<stdio.h> 

void knock_knock(char *s) 
{ 
    while (*s++ != '\0') 
     printf("Bazinga\n"); 
} 

int main() 
{ 
    int data[5] = { -1, -3, 256, -4, 0 }; 
    printf("%08X - %08X - %08X\n", data[0], data[1], data[2]); 
    knock_knock((char *) data); 
    return 0; 
} 
를 사용하여 당신은

FFFFFFFF - FFFFFFFD - 00000100 

기능 knock_knock 인쇄 Bazinga까지 뾰족한 값 0x00 인해

while (*s++ != '\0') 
data 배열의 HEX 값을 볼 수 있습니다

B 여기서 포인터는 chars를 가리키고 있으므로 각 루프마다 단일 바이트를 가리키고 있으므로 첫 번째 0x00에 배열의 세 번째 값인 "첫 번째"바이트에 액세스합니다.

1

배열을 16 진수로 문자 배열로 출력하는 경우 여기에서 일어나는 일을 쉽게 이해할 수 있습니다. 다음은이 프로그램의 출력은 그래서 문자열 "Bazinga"가의 정수 숫자의 표현에 비 0 바이트가있는만큼 여러 번 출력됩니다

FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 
FFFFFFFD FFFFFFFF FFFFFFFF FFFFFFFF 
0 1 0 0 
FFFFFFFC FFFFFFFF FFFFFFFF FFFFFFFF 
0 0 0 0 

#include <stdio.h> 

int main(void) 
{ 
    int data[] = { -1, -3, 256, -4, 0 }; 
    const size_t N = sizeof(data)/sizeof(*data); 

    char *p = (char *)data; 

    for (size_t i = 0; i < N * sizeof(int); i++) 
    { 
     printf("%0X ", p[i]); 
     if ((i + 1) % sizeof(int) == 0) printf("\n"); 
    } 

    return 0; 
} 

입니다

하는 방법을 표시됩니다 정렬. 처음 두 음수는 0 바이트가 표시되지 않습니다.

그러나 어떤 경우에도 숫자 256은 내부 표현의 맨 처음에 이러한 바이트를 갖습니다. 따라서 문자열은 sizeof(int)4 인 경우 정확히 8 번 출력됩니다.

4

정수 배열 data의 데이터를 바이트 단위로 표시해야합니다.4 바이트의 정수이다 가정 표현은 아래에 배열 dataLittle- 엔디안 포맷으로 저장이 수치이다 헥스

-1 --> FF FF FF FF 
-3 --> FF FF FF FD 
256 --> 00 00 01 00 
-4 --> FF FF FF FC 
0 --> 00 00 00 00 

의 숫자를 제공한다. 나는. LSbyte가 먼저옵니다. 그래서,

data ={FF FF FF FF FD FF FF FF 00 01 00 00 FC FF FF FF 00 00 00 00}; 

기능 knock_knock 모든 비 제로를위한이 데이터의 바이트 및 인쇄 Bazinga 통해 간다. 발견 된 첫 번째 0에서 멈 춥니 다. 8 바이트 뒤가됩니다.

(참고 : 정수의 크기는 2 또는 8 바이트 일 수 있지만 포인터 크기가 8 바이트라고 가정 할 때 정수의 크기는 4 바이트라고 추측합니다.)

관련 문제