void * buf = (char *)malloc(sizeof(char) * 512); 버퍼에 캐릭터 포인터 형으로 주소값을 반환하고 메세지를 버퍼에 저장하려고 합니다. int nCnt = 0; recv(s, (char *)buf[nCnt], BUFSIZ, 0); 이런식으로짯는데빨간줄이뜨면서 포인터 형을 오브젝트 타입으로 바꿀 수 없다는 에러메세지를 냅니다. 무엇이 잘못된건가요??
#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
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);
저는 이렇게 생각했습니다.
recv(s, ((char*)((char *)buf)[nCnt]), BUFSIZ, 0);
recv의 인자가 뭔지 잘 모르지만 포인터 형태로 캐스팅해 넘긴 걸로 보아 주솟값을 넘기시려는 것 같은데, 그러면 이렇게 써야 할 겁니다.
(((char *)buf)+nCnt) or (&((char *)buf)[nCnt])
답변 감사드립니다. ㅠㅠ
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
이러면 되네요.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변
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);
저는 이렇게 생각했습니다.
확인해보니. 이러니 그냥도 되네요.
recv(s, ((char*)((char *)buf)[nCnt]), BUFSIZ, 0);
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변 추가.
recv의 인자가 뭔지 잘 모르지만 포인터 형태로 캐스팅해 넘긴 걸로 보아 주솟값을 넘기시려는 것 같은데,
그러면 이렇게 써야 할 겁니다.
(((char *)buf)+nCnt) or (&((char *)buf)[nCnt])
저는 이렇게 생각했습니다.
네 답글 감사합니다.
답변 감사드립니다. ㅠㅠ
댓글 달기