2014-06-11 3 views
0

C 스타일의 문자열이 있으며 그 메모리를 확보해야합니다. 다음 코드 샘플을 보았지만 왜 (void*)이 있는지 혼란스러워합니다.char * data = "abc"; 무료 ((void *) 데이터); 왜 void * 변환입니까? 그게 필요 할까?

char *data = "abc"; 
free((void*)data); 

그냥 두 가지 질문 :

  1. 왜 단순히 free(data)?

  2. (void*) 변환이 필수입니까?

감사합니다.

+5

어쨌든 올바르지 않습니다. 고정 된 리터럴을 사용하지 마십시오. – deviantfan

+2

(아니요, 빈 부분에는 변환이 필요하지 않습니다) – deviantfan

답변

6

아니, 필요는 없습니다; free() 전화가 잘못되어이 작업을 수행 할 수 없습니다.

캐스팅은 원래의 프로그래머가 혼란 스러웠던 거대한 깜박 거리고 튀는 경고 플래그입니다.

malloc() 또는 그 친구 중 한 명에게 이전 호출에서 반환되지 않은 포인터를 free()으로 전달하는 정의되지 않은 동작입니다. 캐스트는 여기에있는 문제 중 가장 적은 것입니다.

문자열 리터럴이 사용하는 메모리를 프로그램에서 제어 할 수있는 방식으로 할당하지 않기 때문에 메모리를 "비울 수"있습니다. 힙에 있지 않으며 힙은 일반적으로 동적 메모리 할당/할당 취소가 발생하는 곳입니다. 귀하의 의도가 잘못되었습니다. 어떤 방법으로 "무료"메모리가 내부적으로 사용되지 않습니다

data = NULL; 

비록 문자 데이터 "abc"를 개최,하지만 괜찮아요 :

당신이 할 수있는 모든 NULL 포인터를 설정한다.

3

(m/c/re)alloc으로 할당되지 않았으므로 free()으로 전화하는 것은 오류입니다.

으로는 옌스 Gustedt 지적, free()void * 아닌 const void *이 걸리기 때문에 당신이 const 포인터를 통과 할 때 캐스팅에만 필요합니다 : 당신이 얻을 캐스트없이

const int *x = malloc(sizeof(int)); 

free((void *)x); 

:

demo.c:8:5: warning: passing argument 1 of ‘free’ discards ‘const’ qualifier from pointer target type [enabled by default] In file included from demo.c:2:0: /usr/include/stdlib.h:488:13: note: expected ‘void *’ but argument is of type ‘const int *’ 
+1

그건 모호합니다. 동적으로 할당되지 않았으므로 캐스팅 * 할 필요가 없습니다. – zneak

+1

불행히도 사실은 필요하지 않습니다. 'const'에 대한 포인터가 있다면 많은 컴파일러가 불평합니다. –

+0

감사합니다 Jens, 편집 됨 –

0

캐스트가 필요하지 않습니다. C에서 void*은 암시 적으로 다른 포인터 유형과 변환 가능합니다. freevoid*을 예상하므로 다른 포인터 유형에서는 캐스트가 필요하지 않습니다.

은 (이미 지적 물론, 코드는 모두 분명히 문제가있다, 그래서 너무 많이로 읽을 수 없습니다.)

0

여기에 귀하의 전제가 틀리면 "데이터"를 전혀 비울 필요가 없습니다. 그렇게하면 충돌이 발생할 가능성이 큽니다. malloc에서 온 데이터에 대해서만 free을 호출해야하며 "abc"은 그 중 하나가 아닙니다.

둘째, C를 사용하는 경우, 당신은해야한다 : C++에서 우리는 또한 char *void * [malloc의 반환 값]을 변환 할 수 없습니다

char *data = malloc(4); 
strcpy(data, "abc"); 
... 
free(data); 

, 당신이 char *data = (char *) malloc(4);을 필요하므로, 그러나 free(data)은 여전히 ​​작동해야합니다. 어떤 컴파일러는 이것을 경고 할 수 있으며 표준 MISRA는 C 타입의 자동 변환을 허용하지 않으므로 명시 적 캐스트가 필요합니다. [언어가 그렇게 말하지는 않지만 MISRA 표준이 수행하기 때문에 이러한 종류의 기준을 검사하기 위해 소스 코드를 읽는 "소프트웨어 검사"가 충족됩니다. 물론

, "신선한"[1] C++, 우리는 malloc 또는 free하지만, newdelete을 사용하지 않아야합니다 :

char *data = new char[4]; 
strcpy(data, "abc"); 
.... 
delete [] data; 

[1] "처음부터 C로 작성된 코드 ++"에서와 같이.

관련 문제