C 中的 Malloc 和结构给了我错误(按照教程)

Malloc and structs in C are giving me errors (following a tutorial)?

本文关键字:错误 教程 Malloc 中的 结构      更新时间:2023-10-16

所以我正在学习一个关于 C 的教程,我被困在结构上,因为它们使用 malloc 函数,而该函数似乎不适合我的编译器(Visual Studio C++ 10.0)。所以我完全按照说明进行操作,我可以编译 C,除了在这个特定的代码中,它给了我一个错误(代码字面意思取自教程网站):

#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 函数一直给人带来麻烦:"无法将 void 类型的值分配给"节点 *"类型的实体,所以我将 (node *) 强制转换为每个包含 malloc 的行,即:

root = malloc( sizeof(struct node) );  

等。这似乎解决了上述错误,但是当我这样做并尝试编译一个新错误时,出现了一个新错误:

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

所以是的,在(作为一个完整的 C 新手)试图弄清楚这个问题半小时之后,我无法想出解决方案。如何解决此错误?我开始认为这是一个编译器问题,但如果不是必需的,我不想更改编译器。

问题是你正在使用C++编译器编译 C 代码。C 允许从 void * 转换为对象指针;C++没有。

说你增加了一个演员表,但没有向我们展示它的样子。如果它看起来像这样,那么代码应该编译为 C 和 C++:

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

或者,可能有一种方法可以告诉编译器将其视为 C,但我对该编译器的了解不足以帮助您。

5年后,我发现了这个话题,它似乎帮助了很多人,包括我。如接受的答案中所述,问题是由您的代码编译为C++引起的,C++不允许此类转换。

或者,可能有一种方法可以告诉编译器将其视为 C,但我对该编译器的了解不足以帮助您。

您可以告诉编译器编译 C 或C++代码。拥有.c扩展并不总是足以让编译器选择。若要手动设置,请在 Visual Studio 2017 中:

解决方案的属性 -> C/C++ ->所有选项 ->编译为 ->编译为 C 代码

为我工作。希望它会有所帮助。