2012-09-02 5 views
0

여기 내 코드입니다 :왜 char 포인터가 자동으로 지워지나요?

tmpip = get_public_ip(); 
pubip = strtok(tmpip, "\n"); 
sprintf(buffer, "220 FTPUtils Server [%s]", pubip); 
len_string = strlen(buffer)+1; 
if(send(newsockd, &len_string, sizeof(len_string), 0) < 0){ 
    perror("Errore invio len buffer"); 
    onexit(newsockd, sockd, 0, 2); 
} 
if(send(newsockd, buffer, len_string, 0) < 0){ 
    perror("Errore durante l'invio"); 
    onexit(newsockd, sockd, 0, 2); 
} 
pubip = NULL; 
free(tmpip); 
memset(buffer, 0, sizeof(buffer)); 


if(recv(newsockd, &len_string, sizeof(len_string), MSG_WAITALL) < 0){ 
    perror("Errore ricezione len user buffer"); 
    onexit(newsockd, sockd, 0, 2); 
} 
if(recv(newsockd, buffer, len_string, 0) < 0){ 
    perror("Errore ricezione del nome utente"); 
    onexit(newsockd, sockd, 0, 2); 
}  
user_string = strtok(buffer, " "); 
username = strtok(NULL, "\n"); 
fprintf(stdout, "%s %s\n", user_string, username); 
sprintf(saved_user, "%s", username); 
memset(buffer, 0, sizeof(buffer)); 

if(recv(newsockd, &len_string, sizeof(len_string), MSG_WAITALL) < 0){ 
    perror("Errore ricezione len pass buffer"); 
    onexit(newsockd, sockd, 0, 2); 
} 
if(recv(newsockd, buffer, len_string, 0) < 0){ 
    perror("Errore ricezione password"); 
    onexit(newsockd, sockd, 0, 2); 
} 
pass_string = strtok(buffer, " "); 
password = strtok(NULL, "\n"); 
fprintf(stdout, "%s %s\n", pass_string, password); 
memset(buffer, 0, sizeof(buffer)); 

printf("%s %s\n", username, password); 

내가 마지막 디버그 printf에 문제가 : 그것은 아무것도를 표준 출력 없음 인쇄!
왜 내 포인터 (사용자 이름 및 암호)가 삭제 되었습니까?
그것은 이상한 때문에 완벽하게 2 fprintf 작동하지만 마지막 printf 아니 ...

+2

'memset'은 전체'buffer'를 제로화했기 때문에'username'과'password'는'buffer' 내부의 특정 바이트를 가리 킵니다. – DCoder

+0

당신은 맞습니다. XD 일어나십시오 polslinux가 깨어납니다 : D – polslinux

+0

이 오류가 있습니까? printf ("% s % s \ n", 사용자 이름, 비밀번호); –

답변

5

모두 usernamebuffer 내부 위치로 password점. 그것이 strtok의 작동 방식입니다.

즉, memset을 사용하여 버퍼를 0으로 설정하면 usernamepassword 점의 메모리를 제로화 할 수 있습니다. strdupmallocstrcpy를 사용하여 구현하는 표준 그러나 아주 쉬운 일이 아닙니다

username = strtok(NULL, "\n"); 
username = strdup(username); 

주 : 간단한 해결 방법은 해당 메모리를 복제하는 것입니다.

+0

고마워요! 나는 strdup하는 것을 생각하지 않고 있었다!! – polslinux

+0

그러나 간단한 질문 : 사용자 이름과 암호를 위해 메모리를 할당했습니다. 이제는 strdup으로 메모리를 복제합니다. 나는이 포인터를 두 번 무료로 사용할 수 있습니까 ??? – polslinux

+0

@polslinux 네,'strdup'에 의해 반환 된 것들을 해제해야합니다. – cnicutar

관련 문제