如何在结构中分配 space
how to allocate space in a struct
我有以下内容:
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 中的定义中初始化结构的数据成员。
您需要创建一个结构类型的对象,并在其声明中对其进行初始化或单独为其数据成员赋值。
例如
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
我有以下内容:
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 中的定义中初始化结构的数据成员。
您需要创建一个结构类型的对象,并在其声明中对其进行初始化或单独为其数据成员赋值。
例如
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