void * 사용 방법

garnete의 이미지

안녕하세요

typedef	struct
{
  char name[2];
  ...      
}st_A;
 
typedef	struct
{
  char name[3];
  ...
}st_B;

소켓으로 받은 데이터가 경우에 따라 A, B의 구조로 되어 있습니다.
내부 변수명은 동일하기 때문에 void* 변수로 받아 사용을 하려고 하는데 오류가 발생 합니다.
방법이 없을까요?

{
  void* val;
 
  // data 수신한 데이터
  if (st_A 구조인경우)
    val = (st_A *)data ;  
  else
    val = (st_B *)data ;
 
  printf("name=[%s]\n", val->name);
}
라스코니의 이미지

이렇게요?

  // data 수신한 데이터
  val = (void *)data;
  if (st_A 구조인경우)
    printf("name=[%s]\n", ((st_A *)val)->name);
  else
    printf("name=[%s]\n", ((st_B *)val)->name);
garnete의 이미지

조언 감사합니다.
좀더 나아가서 (st_A *) 이런 형변환(?) 없이 val을 바로 사용할 수는 없나요?

라스코니의 이미지

void *는 어떤 형도 갖지 않기 때문에 어떤 형도 붙일 수 있지만, 반대로 어떤 형도 없기 때문에 컴파일러가 구조체 내부 멤버 등을 붙일 수가 없습니다. (st_A *) 식으로 컴파일러가 내부 멤버를 쫓아가기 위한 정보를 지시해 주어야 합니다.

garnete의 이미지

시원한 답변 감사합니다.