【问题标题】:how to allocate space in a struct如何在结构中分配空间
【发布时间】:2020-12-20 21:17:55
【问题描述】:

我有以下几点:

int main(void)
{
    typedef struct node
   {
       char * word = malloc(46 * sizeof(char));
       struct node *left;
       struct node *right;
   } node;
 }

但它会产生:

test2.c:12:16: error: expected ';' at end of declaration list
char * word = malloc(46 * sizeof(char));

你如何以及在哪里为结构分配内存?

【问题讨论】:

    标签: c linked-list malloc dynamic-memory-allocation


    【解决方案1】:

    您不能在 C 中的定义中初始化结构的数据成员。

    您需要创建一个结构类型的对象,并在其声明中对其进行初始化或单独为其数据成员赋值。

    例如

    int main(void)
    {
        typedef struct node
       {
           char * word;
           struct node *left;
           struct node *right;
       } node;
    
       node *new_node = malloc( sizeof( node ) );
       new_node->word = malloc( 46 * sizeof( char ) );
       strcpy( new_node->word, "Some word or words" );
       new_node->left = NULL;
       new_node->right = NULL;
     }
    

    这是一个演示程序。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
        typedef struct node
       {
           char * word;
           struct node *left;
           struct node *right;
       } node;
    
       node *new_node = malloc( sizeof( node ) );
       new_node->word = malloc( 46 * sizeof( char ) );
       strcpy( new_node->word, "Some word or words" );
       new_node->left = NULL;
       new_node->right = NULL;
       
       puts( new_node->word );
       
       free( new_node->word );
       free( new_node );
     }
    

    它的输出是

    Some word or words
    

    请注意,如果要在除 main 之外的函数中使用结构,则需要在文件范围内定义结构。

    这是一个更有意义的演示程序。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct node
    {
        char * word;
        struct node *left;
        struct node *right;
    } node;
    
    typedef struct list
    {
        node *head;
        node *tail;
    } list;
    
    int push_back( list *list, const char *word )
    {
        node *new_node = malloc( sizeof( node ) );
        int success = new_node != NULL;
        
        if ( success )
        {
            new_node->word = malloc( strlen( word ) + 1 );
            success = new_node->word != NULL;
    
            if ( success )
            {
                strcpy( new_node->word, word );
                new_node->right = NULL;
                new_node->left = list->tail;
                    
                if ( list->head == NULL )
                {
                    list->head = new_node;
                }
                else
                {
                    list->tail->right = new_node;
                }
                    
                list->tail = new_node;
            }
            else
            {
                free( new_node );
            }
        }
    
        return success;
    }
    
    void free_list( list *list )
    {
        while ( list->head )
        {
            node *current = list->head;
            list->head = list->head->right;
            free( current->word );
            free( current );
        }
        
        list->tail = NULL;
    }
    
    void display_list( const list *list )
    {
        for ( const node *current = list->head; current != NULL; current = current->right )
        {
            printf( "%s -> ", current->word );
        }
        
        puts( "null" );
    }
    
    int main(void)
    {
        list list = { .head = NULL, .tail = NULL };
    
        push_back( &list, "Hello doubly-linked list!" );
        
        display_list( &list );
        
        free_list( &list );
    }
    

    它的输出是

    Hello doubly-linked list! -> null
    

    【讨论】:

    • 你能举个例子吗?
    • 谢谢,但您不必在 malloc 节点之前 malloc 单词吗?节点的内存不是必须包含单词的内存吗?
    • @DCR 嗯,不是吗?为什么?
    • @DCR 字是结构的数据成员。所以你需要分配结构的一个对象来访问它的数据成员。
    • 所以当你 malloc 节点时,你只是分配内存来保存 typedef,然后你可以为任何需要的项目分配空间
    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2013-04-21
    • 2011-05-03
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多