2012-06-14 3 views
3

그래서 나는 C에서 튜토리얼을 따르고 있고 malloc 함수를 사용하고 그 함수가 제 컴파일러 (Visual Studio C++ 10.0)와 잘 어울리지 않는 것 때문에 구조체에 갇혀 있습니다.C의 Malloc과 구조체가 오류를 발생시키고 있습니다 (튜토리얼에 따라)?

#include <stdio.h> 
#include <stdlib.h> 

struct node { 
    int x; 
    struct node *next; 
}; 

int main() 
{ 
    /* This won't change, or we would lose the list in memory */ 
    struct node *root;  
    /* This will point to each node as it traverses the list */ 
    struct node *conductor; 

    root = malloc(sizeof(struct node)); 
    root->next = 0; 
    root->x = 12; 
    conductor = root; 
    if (conductor != 0) { 
     while (conductor->next != 0) 
     { 
      conductor = conductor->next; 
     } 
    } 
    /* Creates a node at the end of the list */ 
    conductor->next = malloc(sizeof(struct node)); 

    conductor = conductor->next; 

    if (conductor == 0) 
    { 
     printf("Out of memory"); 
     return 0; 
    } 
    /* initialize the new memory */ 
    conductor->next = 0;   
    conductor->x = 42; 

    return 0; 
} 

이 malloc을 기능에 문제를주는 유지 : "값 그래서 정확히 지침을 따라 내가이 특정 코드를 제외 C를 컴파일 할 수 있습니다, 그것은 나에게 오류 (코드는 튜토리얼 웹 사이트에서 문자 그대로를) 제공 이것은 위에서 언급 한 오류를 해결하기 위해 듯하지만

root = malloc(sizeof(struct node)); 

등 : 유형의 무효 유형의 엔티티에 할당 할 수 없습니다 "노드 *"그래서 나는 즉, 모든 malloc에 ​​함유 라인 (노드 *)를 주조 내가 그 일을하고 컴파일하려고 시도 할 때 새로운 오류가 발생했습니다 :

1>------ Build started: Project: TutorialTest, Configuration: Debug Win32 ------ 
1> TutorialTest.c 
1>c:\users\ahmed\documents\visual studio 2010\projects\tutorialtest\tutorialtest\tutorialtest.c(16): error C2065: 'node' : undeclared identifier 
1>c:\users\ahmed\documents\visual studio 2010\projects\tutorialtest\tutorialtest\tutorialtest.c(16): error C2059: syntax error : ')' 
1>c:\users\ahmed\documents\visual studio 2010\projects\tutorialtest\tutorialtest\tutorialtest.c(27): error C2065: 'node' : undeclared identifier 
1>c:\users\ahmed\documents\visual studio 2010\projects\tutorialtest\tutorialtest\tutorialtest.c(27): error C2059: syntax error : ')' 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

그래, 30 분 동안 이것을 알아 내려고하자 (완전한 C 초보자로서), 나는 해결책을 찾지 못했습니다. 이 오류를 어떻게 해결할 수 있습니까? 나는 그것이 컴파일러 이슈라고 생각하기 시작했다. 그러나 그것이 필연적이지 않다면 컴파일러를 바꾸고 싶지 않다.

답변

11

문제는 C++ 컴파일러로 C 코드를 컴파일한다는 것입니다. C는 void *에서 객체 포인터로의 변환을 허용합니다. C++은 그렇지 않습니다.

당신은 캐스트를 추가했지만 그것이 어떻게 생겼는지는 알려주지 않았습니다. 그것은 다음과 같습니다 경우, 코드는 모두 C와 C++로 컴파일한다 : C로 처리하는 컴파일러를 말할 수있는 방법이있을 수 있습니다

또는
root = (struct node *) malloc(sizeof (struct node)); 

,하지만 난 그것에 대해 충분히 모른다 컴파일러가 당신을 도울 것입니다.

+0

대단히 감사합니다. 최대한 빨리 답변을 선택하겠습니다 :) – ZimZim

+0

파일 이름이'.c'로 끝나면 VC10은이 파일을 C로 컴파일합니다. 그러나 C로 작성하려면, 다른 컴파일러 사용을 진지하게 고려할 것입니다. Microsoft의 C 지원은 매우 미미한 수준입니다. –

1

5 년 후 나는이 주제가 나를 비롯하여 많은 사람들을 도와 준 것으로 보인다. 허용 된 대답에서 말했듯이이 문제는 코드가 C++로 컴파일 됨으로써 발생하며 C++은 그러한 변환을 허용하지 않습니다.

또는 C로 처리하도록 컴파일러에 지시하는 방법이 있지만 거기에 도움이되는 해당 컴파일러에 대해 충분히 알지 못합니다.

C 또는 C++ 코드를 컴파일하도록 컴파일러에 알릴 수 있습니다. .c 확장을 사용하는 것은 컴파일러가 선택하기에 충분하지 않습니다. 비주얼 스튜디오 2017 년, 수동으로 설정하려면 :

솔루션의 특성 -> C/C++ -> 모든 옵션 -> 컴파일로는 - C 코드

이 나를 위해 일한으로> 컴파일합니다. 희망이 도움이 될 것입니다.

관련 문제