2014-03-03 3 views
0

에 * 구조체에 ... 내가 컴파일 할 때무효 * 나는 기본적인 타입 캐스팅의 질문이 C

void testfunc(void **s) 
{ 
    printf("trying malloc\n"); 
    s[0] = (test*)s[0]; 
    s[0] = (test*)malloc(sizeof(test)); 
    s[0]->a = 2; 
} 

는 그러나, 나는

을 얻을 구조체

typedef struct teststruct { 
    int a; 
} test; 

그리고 간단한 기능을 가지고

test.c:21:7: error: member reference base type 'void' is not a structure or union 
    s[0]->a = 2; 

내가 뭘 잘못하고 있니?

많은 도움을 주셔서 감사합니다. Vik.

+0

왜 매개 변수'무효 **'이 아닌'테스트 **'? – Nabla

+0

javascript에서 nodejs의 외부 함수 인터페이스에서 메서드를 호출해야합니다. void와 사용자 정의 된 구조는 이해하지 못합니다. –

+1

'malloc'의 결과를 캐스팅하지 마십시오. – Barmar

답변

3

이 줄은 의미가 없다 :

s[0] = (test*)s[0]; 

그 자체로 s[0]를 할당한다.

난 당신이 그것이 test*void*에서 s[0]의 유형을 변경을 생각 용의자.
하지만 정확하지 않습니다.

타입 캐스트는 타입 캐스트 시점에서 변수가 즉시 해석되는 방식에만 영향을줍니다.
지속적인 의미에서 변수의 유형을 변경하지 않습니다.

s[0]->a = 2; 

s[0] 여전히 void*이기 때문에 변수 a 위해 그것을 해제 참조하는 것은 유효하지 않습니다 프로그램이이 선에 도달 한 결과

.

당신이 정말로 원하는 것입니다 :

((test*)s[0])->a = 2; 
1

왜냐하면 당신이 당신의 스코프 변수의 유형을 변경할 수 없기 때문입니다. 새로운 유형으로 새 것을 정의해야합니다.

void testfunc(void **s) 
{ 
    printf("trying malloc\n"); 
    test * s_test_type = s[0]; // no need to cast to/from void * 
    s_test_type = (test*)s[0]; 
    s_test_type = (test*)malloc(sizeof(test)); 
    s_test_type->a = 2; 
}