2012-11-09 2 views
2

나는이 : 잘 작동하지만 내가 시도하고 분리 할 때 내가 "잘못된 인수"오류가공유 메모리에서 문자열 배열을 어떻게 분리합니까? C

int array_id; 
char* records[10]; 

// get the shared segment 
if ((array_id = shmget(IPC_PRIVATE, 1, 0666)) == -1) { 
      perror("Array Creating"); 
} 

// attach 
records[0] = (char*) shmat(array_id, (void*)0, 0); 
if ((int) *records == -1) { 
    perror("Array Attachment"); 
} 

.

// detach 
int error; 
if((error = shmdt((void*) records[0])) == -1) { 
     perror(array detachment); 
} 

어떤 아이디어가 있습니까? 고마워요

+1

'shmat'이 "잘"작동한다는 것을 어떻게 알 수 있습니까? 당신은 오류 검사를하지 않았고 ... array_id는 초기화되지 않은 채로 사용됩니다. * 절대 * 수정 된 코드와 불완전한 코드를 게시하지 마십시오. * 항상 * 완성 된 코드와 실제 코드를 게시 할 수 있습니다! – Jens

+0

@Jens 예, 그는 오류가 = -1인지 확인했습니다. 나는 perror (array detachment) 부분에 대해 혼란 스럽다. 사실 그것은 C의 것인가? –

+0

죄송합니다. 오류 체크 아웃을 남겼지 만 첨부 한 후 확인했습니다. 나는 어떤 오류도 발생시키지 않았기 때문에 그것이 잘 작동했다는 것을 알고있다. 그리고 나는 또한 어떤 문자열을 할당하고 그들을 인쇄했다. printf() 대신 perror()를 사용하라고 들었습니다. O.o – Tim

답변

1

shmdt()에서 포인터 인수를 void*으로 변환 할 필요가 없습니다. 자동으로 처리됩니다.

(void*)shmdt((void*) records[0]))에서 삭제하십시오. 그것은 이렇게되어야합니다.

if ((error = shmdt(records[0])) == -1) 
{ 
    perror("Array detachment"); 
} 

그리고 작동합니다.

shmat()에서도 오류시 (void*) -1을 반환하므로 비교 결과 경고가 표시됩니다. 그래서이

if ((char *)records[0] == (void *)-1) 
{ 
    perror("Array Attachment"); 
} 
+0

'== (void *) - 1)'을 테스트 할 때'records [0]'을 캐스팅 할 필요가 없습니다. – alk

+0

Btw : 캐스팅시에도 OP 코드가 작동합니다. – alk

+0

@alk : 주어진'(void *) -1'에서'shmat'에 대한 맨 페이지를 보았습니다. 그래서 내가 썼습니다. 정수에 대한 포인터의 비교가 당신에게 그것을 줄 것이기 때문에 당신은 나를 위해 조금을 정교 할 수 있습니까? – Omkant

1

것이 잘 부착하는 가정하면 같은 invalid argument 단순히 그것이 연결 설정 이후 세그먼트 중 이미 분리되었거나, records[0]의 값이 변화 한 것을 의미 할.

+0

-1에 대해 확인하고 perror를 사용해야합니까? – Tim

+0

내 대답은 문제가 당신이 어떻게 탈착하는지에 있지 않다는 것을 의미합니다. 코드는 기본적으로 Ok입니다. 만약 당신이 그것을 연마하고 싶다면 * Omkant의 * 답으로 가십시오. @ 팀 – alk

+0

당신이 옳았는데, 나는 레코드 [0]을 수정하지 않았고 오류가 사라졌습니다. @alk – Tim

관련 문제