2013-02-21 1 views
0

네트워킹 클래스의 경우 UDP 프로토콜을 기반으로하는 비트 토 런트 클라이언트를 구축하고 있습니다.이 프로토콜은 몇 가지 이유로 C 문자열에 많은 문제가 있습니다. 여기Char * 배열이 값을 보유하지 않음 C

if(server_data == NULL){ 
    server_data = malloc(one_block.total_blocks*sizeof(char*)); 
    int i; 
    for(i = 0; i < one_block.total_blocks; i++){ 
     server_data[i] = malloc(sizeof(char*)); 
     server_data[i] = ""; 
    } 
} 

는 SERVER_DATA가 char**하고 one_block 패킷 정보와 페이로드를 보유하고 struct입니다 :

내가 패킷을 수신 처음, 내가 할.

다음으로 내가 할 : 나는 모든 패킷이 수신되기 전에 SERVER_DATA의 내용을 인쇄 할 때

server_data[one_block.which_block] = one_block.payload; 
blocks_rcv++; 
if(blocks_rcv == one_block.total_blocks-1) 
    done = TRUE; //macro 
if(done){ 
    int i; 
    for(i = 0; i < one_block.total_blocks; i++){ 
     printf("%s", server_data[i]; 
    } 
} 

모두 잘 멋쟁이하지만 어떤 미친 이유로 보인다, 나는 각 패킷에서 다른 데이터를 참조하십시오. 그런 다음 done = TRUE로 설정하고 for 루프로 들어가서 배열의 모든 지점에 동일한 문자열 값이 포함됩니다.

왜 이런 일이 일어나는 지 잘 모르겠지만 배열의 내용이 게시물의 처음부터 끝까지 어떻게 변했는지 이해하고 싶습니다. 한 번에 하나의 패킷. 그것은

server_data[i] = ""; 

리터럴 문자열에 대한 포인터로 할당 된 포인터를 덮어 쓰기 :

+2

'server_data [i] = "";/* memory leak * /' – FatalError

+0

만약 당신이'malloc (sizeof (char *));'를 사용한다면 당신은 4 또는 8 바이트만을 할당한다. –

답변

3

이 줄은 문제입니다. 문자열 리터럴을 수정할 수 없으므로 나중에이 포인터에 복사하면 정의되지 않은 동작이 발생합니다.

확실 문자열이 비어 확인 중 calloc를 사용 '\0'에 첫 번째 문자를 설정하거나 새 문자열에 strcpy 사본에를 사용합니다. 그것이 문자 **로 선언 않다면 그렇게 선언하지 않는 한

1) 먼저, SERVER_DATA가, 나, 박쥐 널 (null)하지 않을 수 있습니다

+0

그래, 그걸 고치지 않았어. – barndog

+0

@ shadow 그러면 할당하고 인쇄 한 내용을 보여줄 필요가 있습니다. –

+0

그것이 내가하는 일입니다. 그게 전부 야. – barndog

0

여기에가는 문제의 몇 가지가 있습니다. NULL로 초기화했는지 여부는 확실하지 않습니다. 명시 적으로 NULL로 초기화하는 것이 좋습니다.

2) 배열 server_data의 각 항목에 char * (즉, 문자열에 대한 참조)를 포함 시키려고하거나 어레이가 문자열이되도록하려면 어떻게 될지 잘 모르겠습니다. 그 자체. one_block.payload가 문자열입니까, 아니면 문자열에 대한 포인터의 집합입니까?

일부 테스트 값으로 코드를 실행했는데 개인적으로 예기치 않은 값으로 문제가 발생하지 않는다 ... 페이로드 데이터를 보유하고있는 구조체가 어떻게 설정되어 있는지 문제가있을 수 있다고 생각합니다. one_block 구조체를 보여 주시겠습니까? one_block.payload는 어떤 유형의 변수/배열입니까?

+0

고마워요.하지만 이미 @ 요아킴 Pileborg 덕분에 그것을 알아 냈습니다. 그것은 적절한 금액을 mallocing하지 않고 strcpy를 사용하지 않는 것과 관련이있었습니다. – barndog

관련 문제