2017-03-10 3 views
-1

나는 TI 칩에서 실행하는 코드를 작성하고 내 코드는 다음 코드 그것은 정말 문제 UART_read이 무엇을 나던동적 할당 stucks

UChar* message; 
UChar* tempMessage; 
message = malloc(bytesOfMessage * sizeof(UChar)); 
int i = 0; 
while(true) 
{ 
    int rxBytes = UART_read(handle, rxBuf, 1); 

    //System_printf("%d \n", rxBuf[0]); 
    if(rxBuf[0] != 13) 
    { 
     message[i] = rxBuf[0]; 
     i++; 
     int l = 1; 

     if(i == bytesOfMessage) 
     { 
      System_printf("first Message: \n"); 
      for(l=0;l<bytesOfMessage;l++) 
      { 
       //System_printf("%c",message[l]); 
      } 
      System_printf("End of first Message\n"); 

      bytesOfMessage += 10; 
      //message = realloc(message, bytesOfMessage * sizeof(UChar)); 


      tempMessage = (UChar*)realloc(message, bytesOfMessage * sizeof(UChar)); 
      message = tempMessage; 
      tempMessage = NULL; 


      System_printf("Message2 %d: \n", bytesOfMessage); 
      for(l=0;l<bytesOfMessage;l++) 
      { 
       //System_printf("%c", message[l]); 
      } 
      System_printf("End of second Message\n"); 
     } 
     UART_write(handle, rxBuf, rxBytes); 
    } 
    else 
    { 
     rxBuf[0] = '\r'; 
     rxBuf[1] = '\n'; 
     rxBuf[2] = 'n'; 
     rxBuf[3] = 'e'; 
     rxBuf[4] = 'w'; 
     UART_write(handle, rxBuf, 5); 
    } 
} 

동안 갇혀됩니다.

하지만 중요한 것은 realloc 기능입니다.

처음으로 코드에 도달하면 정상적으로 작동합니다. 하지만 두 번째로 막 붙어 있습니다. 문제가 칩 또는 운영 체제에있는 정상적인 코드입니까?

+0

malloc & co. ....... – LPs

+0

어쨌든'tempMessage'의 이유는'message (메시지)'를 덮어 쓰기 전에'if (tempMessage! = NULL)'을 검사하는 것입니다 ... – LPs

+1

현명한 사람에게 Word는' alloc' 호출. 또한, 'realloc'의 결과를 테스트하지 않는다면 임시 변수에 아무런 포인트가 없습니다. – KevinDTimm

답변

0

나는 전체 코드를 게시해야한다고 생각합니다. 첫 루프 전에 "byteOfMessage"크기의 메시지 버퍼를 할당합니다. 하지만 첫 번째 루프에서는 메시지를 더 큰 크기 (+10)로 다시 할당합니다. 작동하지만 시스템이 10 바이트를 더 할당 할 수없는 경우 가끔 있습니다. 그래서 realloc 후에 tempMessage를 테스트해야합니다. NULL 일 수 있습니다! 아래

코드가 작동합니다 :

UChar* message; 
UChar* tempMessage; 
message = malloc(bytesOfMessage * sizeof(UChar)); 
int i = 0; 
while (true) 
{ 
    int rxBytes = UART_read(handle, rxBuf, 1); 

    //System_printf("%d \n", rxBuf[0]); 
    if (rxBuf[0] != 13) 
    { 
     message[i] = rxBuf[0]; 
     i++; 
     int l = 1; 

     if (i == bytesOfMessage) 
     { 
      System_printf("first Message: \n"); 
      for (l = 0; l<bytesOfMessage; l++) 
      { 
       //System_printf("%c",message[l]); 
      } 
      System_printf("End of first Message\n"); 

      bytesOfMessage += 10; 

      tempMessage = (UChar*)realloc(message, bytesOfMessage * sizeof(UChar)); 
      if (tempMessage == NULL) 
      { /* system can't realloc more bytes */ 
       tempMessage = malloc(bytesOfMessage * sizeof(UChar)); 
       memcpy(tempMessage, message, bytesOfMessage - 10); 
       free(message); 
      } 
      message = tempMessage; 
      tempMessage = NULL; 


      System_printf("Message2 %d: \n", bytesOfMessage); 
      for (l = 0; l<bytesOfMessage; l++) 
      { 
       //System_printf("%c", message[l]); 
      } 
      System_printf("End of second Message\n"); 
     } 
     UART_write(handle, rxBuf, rxBytes); 
    } 
    else 
    { 
     rxBuf[0] = '\r'; 
     rxBuf[1] = '\n'; 
     rxBuf[2] = 'n'; 
     rxBuf[3] = 'e'; 
     rxBuf[4] = 'w'; 
     UART_write(handle, rxBuf, 5); 
    } 
} 

은 또한 당신이 당신의 코드를 청소해야합니다. 행운을 비네.