练习:阅读用户的一行,并以相反的顺序打印单词。考虑到问题的性质,我实现了一个单链表,来存储单词,然后从堆栈的头部复制堆栈的单词到另一个单链表,然后我将倒序打印第二个列表。为了分配存储在临时值(缓冲区)中的字符串,我为字符串分配了内存。但是,它在编译时给我一个错误,我不明白该错误的性质或如何替换它。 错误:在函数“strcpy”中,将太多字节写入大小取决于“strlen”的区域和在函数“push”中:大小为 [0, 9223372036854775805] 的目标对象由“malloc”分配 理解问题评论的任何问题,我会尽力提供帮助。我是初学者,所以有任何建议,我很乐意。
`
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NOME 256
typedef struct stru_node {
struct stru_node *next;
char *v;
} node;
node *pop (node *head) {
node *new;
if (head != NULL) {
new = head->next ;
free(head);
return new;
}
return NULL;
}
node *push( node *head , const char *buff ) {
node *link = (node*) malloc( sizeof(node) );
link->v = (char *) malloc( sizeof(char) * strlen (buff) );
link->v = strcpy( link->v , buff );
link->next = head;
return link;
}
node *destroy( node *head ) {
while ( head != NULL ) {
head = pop(head);
}
return NULL;
}
void print ( node *head ) {
node *link = head;
for ( link = head ; link != NULL ; link = link->next ) {
printf("%s\n" , link->v );
}
}
int main () {
char buffer[MAX_NOME];
node *head;
while( scanf("%s", buffer) != EOF && strcmp("x" , buffer)) {
head = push( head , buffer );
}
print(head);
return 0;
} `
指针头未初始化
node *head;
你需要写
node *head = NULL;
在函数 push 中,您需要为一个字符串分配内存,包括它的终止零字符 ';。而这个作业
link->v = strcpy( link->v , buff );
是多余的。
函数看起来像
node *push( node *head , const char *buff ) {
node *link = malloc( sizeof(node) );
link->v = malloc( strlen (buff) + 1 );
strcpy( link->v , buff );
link->next = head;
return link;
}
函数
pop
还应释放为存储的字符串分配的内存
node *pop (node *head) {
node *new = NULL;
if (head != NULL) {
new = head->next ;
free( head->v );
free(head);
}
return new;
}
函数
print
应该像这样声明
void print ( const node *head ) {
for ( const node *link = head ; link != NULL ; link = link->next )
{
printf("%s\n" , link->v );
}
}
在 main 中,您应该添加对函数的调用
destroy
head = destroy( head );