C 中的堆栈和动态内存

问题描述 投票:0回答:1

练习:阅读用户的一行,并以相反的顺序打印单词。考虑到问题的性质,我实现了一个单链表,来存储单词,然后从堆栈的头部复制堆栈的单词到另一个单链表,然后我将倒序打印第二个列表。为了分配存储在临时值(缓冲区)中的字符串,我为字符串分配了内存。但是,它在编译时给我一个错误,我不明白该错误的性质或如何替换它。 错误:在函数“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; 
}    `
c linked-list dynamic-memory-allocation singly-linked-list free
1个回答
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 );
© www.soinside.com 2019 - 2024. All rights reserved.