void * 관련 질문입니다.

balgarac1의 이미지

void * buf = (char *)malloc(sizeof(char) * 512);
 
버퍼에 캐릭터 포인터 형으로 주소값을 반환하고
 
 
메세지를 버퍼에 저장하려고 합니다.
 
int nCnt = 0;
 
recv(s, (char *)buf[nCnt], BUFSIZ, 0);
 
 
이런식으로짯는데빨간줄이뜨면서
포인터 형을 오브젝트 타입으로 바꿀 수 없다는 에러메세지를 냅니다.
 
무엇이 잘못된건가요??
shint의 이미지

#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <windows.h>
 
 
int main(int argc, char** argv) 
{
    void * buf = (void *)malloc(sizeof(char) * 512);
 
    int nCnt = 0;
    SOCKET s;
    //[Error] 'void*' is not a pointer-to-object type
//    recv(s, (char *)buf[nCnt], BUFSIZ, 0);
 
    memset(buf, '\0', sizeof(char)*512);
    //[Error] invalid conversion from 'void*' to 'char*' [-fpermissive]
//    strcpy(buf, "0123456789");
 
    int n = (int)(buf);
    char * p = (char*)n;
 
    strcpy(p, "0123456789");
    printf("%s\n", p);
    printf("%s\n", p+5);
    recv(s, (char *)p, BUFSIZ, 0);
 
    free(p);
    return 0;
}
 
#if 0
Linker
"../../../Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32/libws2_32.a"
 
0123456789
56789
#endif

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

HDNua의 이미지

1. https://msdn.microsoft.com/ko-kr/library/2bxt6kc4(v=vs.110).aspx
연산자 우선순위에 의해, 캐스트 연산보다 buf[nCnt] 문장이 먼저 실행되는데,
buf는 void * 형식이므로 *(buf+nCnt)를 해석할 수 없게 되어 발생한 오류입니다.

캐스트 연산자의 우선순위가 높아지도록 괄호를 수정해보세요.
recv(s, ((char *)buf)[nCnt], BUFSIZ, 0);

저는 이렇게 생각했습니다.

shint의 이미지


recv(s, ((char*)((char *)buf)[nCnt]), BUFSIZ, 0);

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

HDNua의 이미지

recv의 인자가 뭔지 잘 모르지만 포인터 형태로 캐스팅해 넘긴 걸로 보아 주솟값을 넘기시려는 것 같은데,
그러면 이렇게 써야 할 겁니다.

(((char *)buf)+nCnt) or (&((char *)buf)[nCnt])

저는 이렇게 생각했습니다.

balgarac1의 이미지

답변 감사드립니다. ㅠㅠ