2016-08-08 3 views
-3

문자열을 처리하기 위해 for 루프 안에 while 루프가 있습니다.C에서 free() 함수의 문제

char myString[1000]; 
//Initialize and maybe change myString 
for(/*conditions*/){ 
    while(/*conditions*/){ 
     if(strchr(myString,' ') == NULL){ 
      break; 
     } 
     char *temp = malloc(sizeof(char) * strlen(myString)); 
     strcpy(temp,myString); 
     *strchr(temp,' ') = '\0'; 
     strcat(myString," "); 
     strcat(myString,temp); 
     free(temp); 
    } 
} 

때때로,이 코드는 잘 작동하지만, 때로는 프로세스가 종료하고 오류 (3 나는 보통 얻을 반환 값이되는 것을 의미 3을 반환 여기 내 코드의 구조는 기본적으로 NULL을 사용하려고 시도합니다. 예를 들어 이 NULL 인 경우 myPointer->example을 싫어합니다. 몇 가지 테스트를 거친 후 문제의 원인이되는 행이 free(temp);이라는 것을 알게되었습니다. if(temp != NULL){free(temp);}으로 바꾸려고했지만 아무 것도 변경하지 않았습니다. 나는 tempmalloc 대신에 char temp[1000]으로 선언하려고 시도했지만 free(temp); 줄을 없애 버렸지 만 여전히 똑같은 일을합니다. free(temp); 줄을 제거하고 여전히 malloc을 사용하면 문제가 해결되지만 거대한 메모리 누수가 있으므로 그렇게 할 수 없습니다. 오류가 있거나 없으면 myString 문자열에 어떤 값이 있는지에 따라 달라집니다. 즉, 거기에 특정 값이 있으면 항상 오류가 발생하고 다른 값이 있으면 오류가 발생하지 않습니다. 어떤 유형의 가치가 작동하는지, 어떤 가치가 작동하지 않는지 알아낼 수 없기 때문에 무작위 적으로 보인다.

free(temp);은 때때로 작동하며 때로는 작동하지 않으며 어떻게 작동시킬 수 있습니까?

+5

'char * temp = malloc (sizeof (char) * strlen (myString)); strcpy (temp, myString); '범위를 벗어남, 정의되지 않은 동작입니다. 또한,'strchr()'이'NULL'을 반환하면'NULL'-dereference에 대한 정의되지 않은 동작이 발생합니다. – EOF

+0

또한,'sizeof (char)'는 정의상 하나이므로,'malloc()'에게 건네지는 인수의 일부로서 중복됩니다. –

+0

간단한 오타로 문제가 발생했기 때문에이 질문을 닫으려고합니다. –

답변

5

중요한 문제는 필요한 메모리보다 적은 하나의 요소를 할당한다는 것입니다.

strlen()은 종료 null을 고려하지 않으므로 필요한 메모리가 부족합니다. 나중에

strcpy(temp,myString); 

바운드 액세스에서 실제로 일을 undefined behavior를 호출합니다 (종료 널 (null)을 저장합니다). 결과적으로

때때로,이 코드는 잘 작동 볼 수 있지만, 때로는 과정은 [...] 종료하고 오류가 있다는 것을 의미 3을 반환

당신이 man page

에서 말했다

char *temp = malloc(strlen(myString) + 1); // +1 for terminating null, 
              // sizeof(char) == 1, guaranteed by C standard. 

같은 할당 문을 수정해야 해결하려면 문자가 발견되지 않는 경우

strchr()strrchr() 기능이 일치하는 문자 또는 NULL 포인터를 반환한다. 널 포인터 상수 역 참조 [...] 강조 시나리오

하고,

*strchr(temp,' ') = '\0';

시도 (NULL) 어느 무효이며 다시 UB를 호출합니다.리턴 된 포인터를 반환하기 전에 유효한 반환 값을 확인하십시오.

+0

.... UB의 경우 예상되거나 예상치 못한 결과가 발생할 수 있습니다. – haccks

+0

@ haccks 오른쪽 선생님,이 부분을 질문의 인용 부분에서 인용 한 것입니다. :) –

+0

@DonaldDuck 대답에서 편집을 확인하십시오. 문제가 지속되면 MCVE를 만드십시오. –