2009-07-26 6 views
6

, 나는 함께 것으로 나타났습니다 :문자 배열

 
char buffer[4]; 
memset(buffer, 0, 4); 
recv(socket, buffer, 4, 0); 

내가받을

mesgx

"mesg"는 임의의 문자가 추가 된 상태로 보내집니다. 내가 대신

 
char * method = (char *) malloc(4); 
memset(buffer, 0, 4); 
recv(socket, buffer, 4, 0); 

를 사용하는 경우

, 내가받을

중 mesg

그래서 내 문자열에 추가 어떤 임의의 물건이 없습니다. 나는 char [5]를 사용하면 잘 작동한다는 것을 알았지 만 왜 그 이유는 모르겠다. malloc (4)는 실제로 5 바이트를 할당합니까? 다섯 번째는 NUL입니까?

답변

16

malloc(4)을 호출하면 실제로 4 바이트 만 할당됩니다. 메모리에있는 다음 바이트가 NUL이되어 우연히 만난 것은 우연이었습니다.

char buffer[4]을 스택에 할당 한 경우 다음 바이트는 'x'이고 다른 일부는 다음 NUL 바이트가 발견 될 때까지 계속되었습니다.

소켓 함수는 바이트 만 처리하며 후행 NUL 또는 추가 항목이있는 문자열로 바이트를 처리하지 않습니다. 당신은 당신이 요구하는 것을 정확하게 얻습니다.

6

NULL 종료가 제대로 이루어 지려면 5 문자가 필요합니다. 종료되는 NULL은 1로 간주되므로 N 문자가 필요할 경우 N + 1을 할당하십시오. 또는 반대로 N 할당에 대해 N-1을 사용할 수 있습니다.

+0

나는 그다지 많이 생각하지 않았지만 왜 malloc과 함께 작동합니까? – fresskoma

2

recv에만 최대 4 바이트를 버퍼에 저장하도록 요청한 경우에만 char 이상을 수신 할 수 없습니다. 실제로 반환 된 바이트 수를 확인하려면 반환 값 recv을 확인해야합니다.

출력을 생성하는 모든 루틴에서 4 char을 출력하는 데에만주의하지 않는다고 생각됩니다. NULL이 아닌 가능한 종료 된 버퍼 char 버퍼의 초기 내용을 표시하는 한 가지 방법은 다음과 같습니다.

printf("%.4s\n", buffer); 

전체 recv 전화 조각은 수 있습니다 :

#define MAX_BUF_LEN (512) 
char buffer[MAX_BUF_LEN]; 
ssize_t count = recv(socket, buffer, MAX_BUF_LEN, 0); 

if (count > 0) 
    printf("%.*s\n", count, buffer); 
3

나는 차이가 우연의 일치입니다 생각한다. buffer를 문자열처럼 사용하면 (예 : printf()에서 '\ 0'이 발견 될 때까지 한계를지나 읽습니다.

두 경우 모두 buffer [5] 또는 malloc (5)을 사용해야합니다. memset()은 필요하지 않아야하며 recv() 뒤에 buffer [4] = '\ 0'을 넣는 것이 좋습니다.