2016-06-25 3 views
-3

포인터를 사용하여 작업을 보완하려고합니다. 그래서 이름이 분리 점을 제거하여 레이블로 분리되는 테스트 프로그램을 작성했습니다. 각 라벨은 다음과 같이 길이/데이터 쌍으로 표시됩니다. google.ru는 "x \ 06googlex \ 02ru"로 표시됩니다. 내 테스트 기능에서 돌아 왔을 때 신호 SIGABRT가 표시됩니다. 포인터로 인한 잘못된 작업으로 인한 것 같습니다. 당신은뿐만 아니라 C++를 태그하기 때문에신호 가져 오기 SIGABRT

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
void test(unsigned char* dns, unsigned char* host); 

int main(int argc, const char * argv[]) 
{ 

    unsigned char host[]="google.ru"; 

    unsigned char* dnsTest=(unsigned char*)malloc(20); 

    if(dnsTest==NULL) 
    { 
     exit(1); 
    } 

    test(dnsTest, host); 

    printf("%s", dnsTest); 

    free(dnsTest); 


    return 0; 
} 
void test(unsigned char* dns, unsigned char* host) 
{ 
    strcat((char*)host, "."); 

    int lock=0; 

    for(int i=0; i<strlen((char *)host);i++) 
    { 
     if(host[i]=='.') 
     { 

      *dns=i-lock; 

      dns++; 

      for(;lock<i; lock++) 
      { 
       *dns=host[lock]; 
       dns++; 

      } 
       lock++; 
     } 
    } 
    *dns='\0'; 

} 
+1

이 C 또는 C++입니까? – melpomene

+4

'strcat ((char *) host, ".");'- 버퍼 오버플로 – melpomene

+0

@melpomene : C99 또는 C++ 중 하나이지만 그 질문은 중요하지 않습니다. – Jezor

답변

0

, 당신은 new \ delete 대신 malloc \ free 사용할 수 있습니다. New 생성자 (당신이 클래스를 배울 때 도움이 될 것입니다), 그리고 당신에게 정확한 유형 new 수익을 호출하므로 필요가 캐스팅 없습니다 (주조는 거의 항상 나쁜 생각입니다) new와 메모리 할당 후

그런 주장 중복됩니다 : C 이후

if(dnsTest==NULL) 

++ new 기본적으로 예외가 발생합니다. 계속 진행한다면 std::string을 사용할 수 있습니다. 포인터를 이해하는 작업이 아닌 C 널 종료 문자열보다 훨씬 간단합니다.

다른 모든 의견 (중복 strlen 사용 및 부재는 '\0' 기호)도 정확하지만 두 가지 조언, 포인터 파악 방법을 알려 드리고 싶습니다.

먼저 - K&R을 읽으십시오 - 성경입니다.

두 번째 - Microsoft Visual Studio를 사용하는 경우 디버그 모드에서 코드를 컴파일하고 메모리보기 탭을 사용할 수 있습니다. Visual Studio 컴파일러는 디버그 모드에서 일부 마법 번호를 메모리 (link)에 저장합니다. 할당되지 않은 메모리를 어디에 처리하는지 또는 메모리 레이아웃이 정확히 어떻게 보이는지를 이해하는 데 도움을 줄 수 있습니다.