2012-08-22 2 views
3
struct node* new_node = 
      (struct node*) malloc(sizeof(struct node)); 

여기 *를 이해하지 못합니다. ...(struct node*) malloc(siz... 먼저 *는 노드 또는 malloc에 ​​속한가요? 무슨 뜻이에요? 포인터가 메모리 함수 malloc과 어떤 관련이 있습니까? 내가malloc에 ​​대한 포인터?

감사

+4

그 (불필요한) 캐스트. 'malloc()'의 반환 값은'void *'이다. 자세한 내용은 http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – hmjd

+2

"포인터가 메모리 기능과 관련이있는 방법"- 아주 모든 것 –

답변

6

괄호 유형 이름 (예 : (struct node *)) C에서 "캐스팅"라고합니다. 표현식의 형식을 명명 된 형식으로 변경하는 방법이며 포인터와 함께 일반적으로 사용됩니다.

그러나 이것은 Do I cast the result of malloc의 조언을 무시하는 코드입니다. 캐스트는 여기 이 아니고 여기에이 필요합니다. 제 의견으로는, 그리고 아마도 그 코드를 읽었을 때 매우 놀랍지 만 나쁜 코드 일 것입니다. ,

struct node * new_node = malloc(sizeof *new_node); 

이 정확히 한 번 유형을 언급 오류를 소개하고 모두가 읽을 무의미하고 복잡 할 수있는 캐스팅을 삭제하는 방법과 지정할 때 취성을 도입 피한다 :

이 할당을 작성하는 가장 좋은 방법은 할당 할 많은 메모리. 그것은 이기고,이기십시오.

+0

+1 깔끔하고 깨끗합니다. 모든 C가 눈이 아프지는 않습니다! –

+1

내 의견으로는,'node_t * new_node = malloc (sizeof (node_t));'는 눈이 적다. – Lundin

0

* 표시 위치에 정말 혼란 스러워요 *유형하기위한 것이다. 이 유형은 struct node* (struct node에 대한 포인터)입니다.

malloc 함수에 "연결"되어 있지 않으므로 해당 유형에 "연결"됩니다. malloc()은 포인터를 반환하므로 반환 값을 포인터로도 할당합니다.

2
struct node  <= type 
*new_node  <= pointer named new_node (of type struct node) 
=    <= assignment 
(struct node *) <= cast to pointer of type struct node 
malloc(SIZE) <= returns pointer of type void, thus needs cast 
+0

이 예제에서'= '는 할당이 아니라 초기화 구문의 일부입니다. 그것이 C에서 많은 실질적인 차이를 만들어 내지는 않지만, C 문법이 그것을 부르는 것입니다. –

+0

필자는 그 유형이'struct node *'(노드에 대한 포인터)라고 말하고 싶습니다. 또한 캐스트가 필요한 void 포인터에 대해 올바르지 않습니다. – Lundin

+0

@Lundin : 문법적으로'struct node'는 * 타입 지정자 *이고, * new_node는 * 선언자 *입니다. 결과적으로'new_node'의 타입은'struct node *'이지만,'*'는 타입 지정자의 일부가 아니라는 선언에서도 사실입니다. 그러므로 예를 들어'struct node * ptr, instance; '. –

1

(struct node*)캐스트입니다. 이는 명시 적 유형 변환입니다. *struct node에 속하며 요청 된 유형이 struct node 변수에 대한 포인터임을 나타냅니다. malloc()은 항상 void 포인터 인 void*을 반환합니다.

malloc의 함수 정의는 void* malloc (size_t size);입니다 (이 경우 도 void에 속합니다).

질문에 게시 된 코드를 작성한 사람이이 void 포인터를 struct node*에 캐스팅했습니다. 왜 그들이 이것을했는지는 확실하지 않습니다. C에서 포인터가 어떻게 움직이는 지 혼란스럽고 그러한 캐스트가있는 위험을 인식하지 못하거나 코드가 C++ 용으로 작성되었습니다.

C 언어의 void 포인터는 cast (1)없이 다른 포인터 유형으로 변환 할 수있는 일반 포인터 유형입니다.

그러나 C++에는 C보다 엄격한 유형 변환 규칙이있어서 명시 적 변환을 적용하기 때문에 항상 C++에서 void 포인터를 변환해야합니다.

#include를 통해 올바른 함수 프로토 타입을 제공하지 않으면 컴파일러의 기본 동작이 시작되고 malloc이 반환한다고 잘못 인식하기 때문에 C에서 malloc() 결과를 캐스팅하는 것은 위험하며 버그 (2)로 간주됩니다. int. 특정 시스템의 포인터 및 정수 너비에 따라 정상적으로 작동하거나 프로그램이 충돌하거나 메모리 누수가 발생할 수 있습니다.

그러나 C++에서 malloc()의 결과를 캐스팅해야합니다.


참고 :

  1. ISO 9899 : 2011 6.3.2.3/1.
  2. Specifically, what's dangerous about casting the result of malloc?
+0

"형 변환"을 "캐스팅"이라고합니다. 그리고 "명시 적 [유형] 캐스트"는 중복됩니다. 모든 형변환은 명시 적이며 암시 적 변환은 형 변환이 아닙니다. –

+0

@KeithThompson 좋아, 좀 까다 롭지 만, C 표준에서 사용 된 공식 용어 인 _cast_, _implicit conversion_ 및 _explicit conversion_을 사용하도록 게시물을 업데이트했습니다. 그러나 초보 프로그래머에게는 어떤 차이가 있는지 잘 모르겠습니다. – Lundin

+0

나는 여기에서 그것을 가지고 갔다 : http://www.geeksforgeeks.org/archives/860 저것은 C++인가? 아니면 나쁜 서면 코드인가? – Segev

0

그냥 type casting입니다.

mallocvoid 포인터 (모든 유형이없는 포인터)를 반환합니다. (struct node *)malloc에 의해 반환 된 void 포인터에 유형을 지정한다는 것을 의미합니다. 도 참조하십시오. this

0

그냥 유형 캐스팅입니다. 실제로 malloc 함수는 무효 포인터 (void *)를 반환하는데, 이는 데이터 구조 나 데이터 유형과 관련이 없음을 의미합니다. 일반 포인터를 반환합니다. 타입 캐스팅으로 리턴 된 값을 지정합니다.이 경우 (struct node *)는 struct의 노드 유형에 대한 포인터입니다.

간단히 말해 void 포인터 (void *)를 구조체 포인터 (struct node *)로 변환한다고 말할 수 있습니다.

관련 문제