Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stack和push()函数_C - Fatal编程技术网

Stack和push()函数

Stack和push()函数,c,C,我正在做一个练习,希望得到支持。问题是:我有两个结构(1个用于堆栈的节点,1个用于堆栈)。在节点结构中,有一个void*数据字段 我尝试在堆栈上推送一个值,但由于void*数据而不是简单数据,我失败了 这是关于结构和push()函数的代码 struct upo_stack_node_s { void *data; struct upo_stack_node_s *next; }; typedef struct upo_stack_node_s upo_stack_node_t;

我正在做一个练习,希望得到支持。问题是:我有两个结构(1个用于堆栈的节点,1个用于堆栈)。在节点结构中,有一个void*数据字段

我尝试在堆栈上推送一个值,但由于void*数据而不是简单数据,我失败了

这是关于结构和push()函数的代码

struct upo_stack_node_s
{
    void *data;
    struct upo_stack_node_s *next; 
};
typedef struct upo_stack_node_s upo_stack_node_t;

struct upo_stack_s
{
    upo_stack_node_t *top;
    size_t size;
};

/*Function for create the stack*/
upo_stack_t upo_stack_create()
{
    upo_stack_t stack = malloc(sizeof(struct upo_stack_s));
    if (stack == NULL)
    {
        fprintf(stderr, "Unable to create a stack!\n");
        abort();
    }

    stack->top = NULL;
    stack->size = 0;

    return stack;
}

/*Push() function:*/
void upo_stack_push(upo_stack_t stack, void *data)
{
    /* TO STUDENTS:
    *  Remove the following two lines and put here your implementation
    */     
    upo_stack_node_t *node = malloc(sizeof(struct upo_stack_node_s));
    node->data = data; /*<-- Here's the problem */
    node->next = stack->top;
    stack->top = node;
    ++stack->size;
}

/*Top() function*/
void* upo_stack_top(const upo_stack_t stack)
{
    /* TO STUDENTS:
     *  Remove the following two lines and put here your implementation
     */
    return (void *)(stack->top); //<---
}

/*Function for testing (there are other functions in the code)*/
void test_top()
{
    int value1 = 1;
    int value2 = 2;
    upo_stack_t stack;

    stack = upo_stack_create();

    upo_stack_push(stack, &value1); //<----
    upo_stack_push(stack, &value2); //<----

    assert( upo_stack_top(stack) != NULL );
    assert( *((int*) upo_stack_top(stack)) == value2 ); <-- Here's the error

    upo_stack_pop(stack, 0);

    assert( upo_stack_top(stack) != NULL );
    assert( *((int*) upo_stack_top(stack)) == value1 );

    upo_stack_pop(stack, 0);

    assert( upo_stack_top(stack) == NULL );

    upo_stack_destroy(stack, 0);
}
struct upo\u stack\u node\s
{
作废*数据;
结构upo\U堆栈\U节点\U s*下一步;
};
typedef struct upo_stack_node_s upo_stack_node_;
结构upo\u堆栈
{
upo_堆栈_节点_t*top;
大小;
};
/*用于创建堆栈的函数*/
upo_堆栈\u t upo_堆栈\u创建()
{
upo_stack_t stack=malloc(sizeof(struct upo_stack_s));
if(stack==NULL)
{
fprintf(stderr,“无法创建堆栈!\n”);
中止();
}
stack->top=NULL;
堆栈->大小=0;
返回栈;
}
/*Push()函数:*/
无效upo\U堆栈\U推送(upo\U堆栈\U t堆栈,无效*数据)
{
/*学生:
*删除以下两行,并将实现放在这里
*/     
upo_stack_node_t*node=malloc(sizeof(struct upo_stack_node));

node->data=data;/*您始终必须传递一个空指针。这意味着如果您想要传递一个简单的值,比如1,您需要做的是分配一个整数值,并将指针作为空指针传递给它

因此类似于:

int x = 4;
upo_stack_push(upo_stack, &x);
当然,您必须确保int变量x没有超出范围,否则指针将指向已释放的内存,这将导致严重的内存问题

更新

上面假设,您传递的无效指针已经存储在堆栈作用域的内存中。如果您希望堆栈本身复制数据,您还必须为其分配malloc空间,这样不仅可以malloc节点,还可以malloc和复制传递的数据类型。还要知道数据的大小(因为它是一个空指针,不知道它的类型),所以必须向push函数添加一个int size参数


对于要存储的整数值,请将其作为指针传递,大小为:sizeof(int)。对于复制数据结构,请使用memcpy。这仅适用于没有指针的简单类型和结构。如果必须使用指针复制结构(因此需要所谓的深度复制)它是如何失败的?并向我们展示如何调用函数失败的原因是存储的值不是传递的值。函数的调用方式如下:int value1=1;int value2=2;upo\U堆栈推送(堆栈,&value1);upo\U堆栈推送(堆栈,&value2);堆栈已创建感谢答案。问题是:我如何将作为参数传递的void*数据存储在结构upo_struct_node_s的数据字段中?再次感谢感谢感谢答案。我编辑了代码。不幸的是,我无法添加其他参数。我必须使用这两个参数。在这种情况下,我恐怕你会ve存储实际值(结构或整数)然后在堆栈中“使用”它们,这样它只保留引用。例如,将所有值存储在一个大数组中,让堆栈处理引用,但这可能不是您想要的。再次感谢。另一个问题:在void*data中,我必须存储值或值的地址,因为它是指针而不是基元类型(例如int)?我的意思是,在节点的数据字段中,我应该存储值本身或地址?始终存储地址(因为您无法在简单数据类型或指针/结构数据类型中进行区分)。因此,如果您要传递int值(例如2),请不要传递2,而是创建一个整数(malloc it),并将其作为在堆栈中存储指针(指向2)的指针传递。