struct node* new_node =
(struct node*) malloc(sizeof(struct node));
여기 *를 이해하지 못합니다. ...(struct node*) malloc(siz...
먼저 *는 노드 또는 malloc에 속한가요? 무슨 뜻이에요? 포인터가 메모리 함수 malloc과 어떤 관련이 있습니까? 내가malloc에 대한 포인터?
감사
struct node* new_node =
(struct node*) malloc(sizeof(struct node));
여기 *를 이해하지 못합니다. ...(struct node*) malloc(siz...
먼저 *는 노드 또는 malloc에 속한가요? 무슨 뜻이에요? 포인터가 메모리 함수 malloc과 어떤 관련이 있습니까? 내가malloc에 대한 포인터?
감사
괄호 유형 이름 (예 : (struct node *)
) C에서 "캐스팅"라고합니다. 표현식의 형식을 명명 된 형식으로 변경하는 방법이며 포인터와 함께 일반적으로 사용됩니다.
그러나 이것은 Do I cast the result of malloc의 조언을 무시하는 코드입니다. 캐스트는 여기 이 아니고 여기에이 필요합니다. 제 의견으로는, 그리고 아마도 그 코드를 읽었을 때 매우 놀랍지 만 나쁜 코드 일 것입니다. ,
struct node * new_node = malloc(sizeof *new_node);
이 정확히 한 번 유형을 언급 오류를 소개하고 모두가 읽을 무의미하고 복잡 할 수있는 캐스팅을 삭제하는 방법과 지정할 때 취성을 도입 피한다 :
이 할당을 작성하는 가장 좋은 방법은 할당 할 많은 메모리. 그것은 이기고,이기십시오.
+1 깔끔하고 깨끗합니다. 모든 C가 눈이 아프지는 않습니다! –
내 의견으로는,'node_t * new_node = malloc (sizeof (node_t));'는 눈이 적다. – Lundin
* 표시 위치에 정말 혼란 스러워요 *
이 유형하기위한 것이다. 이 유형은 struct node*
(struct node
에 대한 포인터)입니다.
malloc
함수에 "연결"되어 있지 않으므로 해당 유형에 "연결"됩니다. malloc()
은 포인터를 반환하므로 반환 값을 포인터로도 할당합니다.
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
이 예제에서'= '는 할당이 아니라 초기화 구문의 일부입니다. 그것이 C에서 많은 실질적인 차이를 만들어 내지는 않지만, C 문법이 그것을 부르는 것입니다. –
필자는 그 유형이'struct node *'(노드에 대한 포인터)라고 말하고 싶습니다. 또한 캐스트가 필요한 void 포인터에 대해 올바르지 않습니다. – Lundin
@Lundin : 문법적으로'struct node'는 * 타입 지정자 *이고, * new_node는 * 선언자 *입니다. 결과적으로'new_node'의 타입은'struct node *'이지만,'*'는 타입 지정자의 일부가 아니라는 선언에서도 사실입니다. 그러므로 예를 들어'struct node * ptr, instance; '. –
(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()의 결과를 캐스팅해야합니다.
참고 :
"형 변환"을 "캐스팅"이라고합니다. 그리고 "명시 적 [유형] 캐스트"는 중복됩니다. 모든 형변환은 명시 적이며 암시 적 변환은 형 변환이 아닙니다. –
@KeithThompson 좋아, 좀 까다 롭지 만, C 표준에서 사용 된 공식 용어 인 _cast_, _implicit conversion_ 및 _explicit conversion_을 사용하도록 게시물을 업데이트했습니다. 그러나 초보 프로그래머에게는 어떤 차이가 있는지 잘 모르겠습니다. – Lundin
나는 여기에서 그것을 가지고 갔다 : http://www.geeksforgeeks.org/archives/860 저것은 C++인가? 아니면 나쁜 서면 코드인가? – Segev
그냥 type casting입니다.
malloc
은 void 포인터 (모든 유형이없는 포인터)를 반환합니다. (struct node *)
은 malloc
에 의해 반환 된 void 포인터에 유형을 지정한다는 것을 의미합니다. 도 참조하십시오. this
그냥 유형 캐스팅입니다. 실제로 malloc 함수는 무효 포인터 (void *)를 반환하는데, 이는 데이터 구조 나 데이터 유형과 관련이 없음을 의미합니다. 일반 포인터를 반환합니다. 타입 캐스팅으로 리턴 된 값을 지정합니다.이 경우 (struct node *)는 struct의 노드 유형에 대한 포인터입니다.
간단히 말해 void 포인터 (void *)를 구조체 포인터 (struct node *)로 변환한다고 말할 수 있습니다.
그 (불필요한) 캐스트. 'malloc()'의 반환 값은'void *'이다. 자세한 내용은 http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – hmjd
"포인터가 메모리 기능과 관련이있는 방법"- 아주 모든 것 –