2017-11-29 9 views
1

예를 들어, 파이썬에서, 당신은 단지 같은 튜플을 전달할 수 있습니다하나의 void 포인터 인수에 여러 개의 인수를 전달하는 좋은 방법은 무엇입니까? (C)는 하나 개의 인수로 몇 가지를 통과하기를 원한다면

thread_create(v, w, x, (y, z)) 

을 나는 것들에 대한 포인터의 배열을 전달하는 생각을했다 I 다른 함수에서 액세스하려고하지만 다른 유형입니다. 무효 포인터 또는 이와 비슷한 배열을 만드는 방법이 있습니까?

인수는 void * 타입이며, 실제로 익숙하지 않은 개념입니다.

+4

은 찾고자하는 구조체 인 '구조체'입니까? –

+0

오, 나는 그것을 생각하지 않았다! –

답변

0

당신은 파이썬에서와 같은 일을합니다 : 여러 객체로 구성된 복합 객체 인 인수를 전달합니다. C가 저수준 언어이기 때문에 여러 가지를 수동으로 관리해야합니다. 복합 객체의 유형을 선언해야하며, 해당 유형을 일관되게 사용하고 복합 객체의 메모리를 관리해야합니다. 따라서 파이썬에서와 같은 개념적 핵심이지만 실제로는 훨씬 어렵습니다.

C에는 정적 유형이 있고 해당 유형 시스템에는 구조적 집계 유형이 없으므로 전달할 데이터의 유형을 선언해야합니다. 정수와 문자를 전달하려고한다고 가정 해보십시오.

typedef struct { 
    int y; 
    char *z; 
} thread_param_t; 

스레드 만들기 함수를 호출 할 때이 유형의 개체를 만들어 포인터를 전달해야합니다.

thread_param_t param = {42, "hello"}; 
pthread_create(thread, attr, entry_point, &param); 
… 
pthread_join(thread, NULL); 

스레드의 코드를 실행하는 기능은 유형 void*의 인수를 사용합니다. void*은 무엇입니까? C에서 다형성을 수행하는 방법입니다. void에 대한 포인터는 포인터가 무엇을 가리키는 지 알려주지 않습니다. 그것을 전달하는 것 이외에 직접적으로 사용될 수는 없지만, 모든 타입에 대한 포인터는 void에 대한 포인터로 변환 될 수 있고 그 반대도 가능합니다. 예를 들어, pthread_create의 네 번째 인수는 void* 유형이며, 위에는 thread_param_t* 유형의 매개 변수를 전달했습니다.

void* entry_point(void *param_arg) { 
    thread_param_t *param = param_arg; 
    printf("entry_point called with y=%d and z=%s\n", param->y, param->z); 
    … 
} 

런타임시 C가 유형 정보를 전달하지 않습니다. 포인터를 void*으로 변환하고 원래 형식으로 되돌려도 좋습니다. 포인터를 void*으로 변환 한 다음 다른 유형의 포인터로 변환하는 것은 좋지 않습니다. 실수로이 작업을 수행하면 좋은 예외가 발생하지 않으며 운이 좋으면 메모리가 부족한 경우 충돌이 발생합니다 손상되지 않았거나 디버깅하기 어려운 동작이 있는지 확인하십시오.

또한 매개 변수 개체가 사용하는 메모리를 관리해야합니다. 위에서 매개 변수 객체를 로컬 변수로 선언하는 방법을 살펴 보았습니다. 이 함수를 함수에 넣으면 함수가 반환 될 때까지 객체가 존재합니다. (블록에 param이 선언되면 블럭의 닫는 중괄호까지만 유효합니다.) 함수가 스레드가 매개 변수 객체에 대한 액세스를 마칠 때까지 기다리는 것이 좋습니다. 스레드를 끝내기를 기다렸습니다. 하지만 종종 충분하지 않으므로 동적으로 메모리를 할당해야합니다. 객체가 동적으로 할당되기 때문에

thread_param_t *param; 
param = malloc(sizeof(*param)); 
if (param == NULL) …; 
pthread_create(thread, attr, entry_point, &param); 

, 당신은이 개체를 사용하여 끝낸 후 entry_point에 아마, 어떤 시점에서 그것에 free를 호출해야합니다.