2014-04-05 3 views
0

내 C 코드에 다소 문제가 있습니다 (이 언어에 다소 익숙 함). ..C pthreads 및 malloc/seg 오류 오류

RTSPClient *clientInfo = (RTSPClient*) malloc(sizeof(RTSPClient)); 
if (!clientInfo) 
{ 
printf("There wasn't enough memory to fufill the connection.\n"); 
continue; 
} 
clientInfo->socket = new_fd; 

pthread_create(&thread, NULL, handleClientConnection, (void *) clientInfo); 

... RTSPClient 다음

typedef struct { 
    int socket; 
    int session_id; 
    PlaybackTimer* playback_timer; 
    CvCapture* video; 
} RTSPClient; 

우리가 구조체에 비디오 필드를 액세스하려고

, 우리는 점점이다

: 나는 다음과 같은 코드가 있습니다 seg faults. 명확하게 할당하지 않았지만이 문제를 해결할 수있는 방법이 궁금합니다. 스레드가 시작되기 전에 할당 된 clientInfo 객체에 전역 변수를 유지해야합니까, 아니면 정적으로 할당해야합니까?

도움을 주시면 감사하겠습니다.

+0

당신이 비디오와 playback_timer을 설정하는 가리 키도록? 그것이 의미하는대로 그들은 메모리의 임의의 위치를 ​​가리킨다. –

+0

모르시는 곳의 모든 캐스트를 제거하십시오. 정확히 무엇을하고 있는지 ** 올바른 작동을 위해 ** 캐스트 **가 필요한 이유를 설명 할 수 있습니다. 컴파일러를 꺼내지 말고, 대신에'-Wall -Wextra'를 사용하고 모든 경고를 적절하게 처리하십시오. – Deduplicator

+0

'void openVideo (CvCapture * video, char * file_path) { \t // 비디오 파일을 엽니 다. \t video = cvCaptureFromFile (file_path); \t if (! video) { \t \t printf ("could not open video % s \ n", file_path); \t} } – tuck

답변

3

RTSPClient *clientInfo = (RTSPClient*) malloc(sizeof(RTSPClient));clientInfo 구조체에 대해서만 메모리를 생성합니다. 또한 CvCapture* video; 및 기타 모든 포인터에 메모리를 할당해야합니다. (그렇게 할 경우, 할당 된 구조로 어떻게 작업하는지 더 많은 코드를 보여주십시오).

메모리 할당에 실패한 경우를 대비하여 continue을 반드시 사용해야합니까? 충분한 메모리가 없으면 아무 것도 작동하지 않을 것입니다.

(그리고 당신은 C 응용 프로그램에서 malloc의 반환 값을 캐스팅 할 필요가 없습니다)

+0

맞아, 나는 정말로 내가 왜 CvCapture의 크기가 malloc인지 알 수 없다고 생각했다. 예를 들어'clientInfo-> video = (CvCapture *) malloc (sizeof (struct CvCapture)); '단지 오류가 발생했습니다'오류 : 'sizeof'가 불완전한 유형 'struct CvCapture''에 유효하지 않습니다. – tuck

+0

이것은 다릅니다. 당신은'CvCapture'의 전체 struct 선언을 가지고 있지 않습니다. 구조체'CvCapture'는 public 인터페이스를 가지지 않고 오직 비디오 캡쳐 함수의 매개 변수로만 사용됩니다. (opencv doc) – fritzone

+0

'cvCreateFileCapture' 또는'cvCreateCameraCapture'를 사용하여'CvCapture' 구조체를 얻습니다. – fritzone