Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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
C 如何使void指针按照下面描述中的要求工作?_C_Void Pointers - Fatal编程技术网

C 如何使void指针按照下面描述中的要求工作?

C 如何使void指针按照下面描述中的要求工作?,c,void-pointers,C,Void Pointers,我正在尝试用C程序实现一个堆栈。 这是我的程序的头文件,Stack.h #ifndef STACK_H #define STACK_H typedef struct node { void *data; struct node *next; }Stack; void push(Stack **, void *); void *pop(Stack **); void *peek(Stack **); #endif 这是我在Stack.c文件中实现的函数 #includ

我正在尝试用C程序实现一个堆栈。 这是我的程序的头文件,
Stack.h

#ifndef STACK_H
#define STACK_H


typedef struct node {

    void *data;
    struct node *next;
}Stack;


void push(Stack **, void *);
void *pop(Stack **);
void *peek(Stack **);

#endif
这是我在
Stack.c
文件中实现的函数

#include <stdlib.h>
#include "Stack.h" 

void push(Stack **TOP, void *data) {

    Stack *PTR;

    PTR = (Stack *)malloc(sizeof(Stack));
    if(!PTR) return;

    PTR->data = data;
    PTR->next = *TOP;
    *TOP = PTR;
}

void *pop(Stack **TOP) {

    Stack *PTR;
    void *data;
    PTR = *TOP;

    *TOP = PTR->next;
    data = PTR->data;
    free(PTR);

    return data;
}

void *peek(Stack **TOP) {

    Stack *PTR;
    PTR = *TOP;

    return PTR->data;
}
#include <stdio.h>
#include "Stack.h"

int main() {

    int count;
    Stack *TOP = NULL;


    for(count = 0; count < 100; count += 10)
        push(&TOP, &count);

    while(TOP != NULL)
        printf("%d\n", *(int *)pop(&TOP));
}
这样打印出
100
11次,如下所示:

100
100
100
100
100
100
100
100
100
100
100 
#include <stdio.h>
#include "Stack.h"

int main() {

    Stack *TOP = NULL;
    int a = 5;
    char b = 'A';
    float c = 15.98;
    long d = 225678460;


    push(&TOP, &a);
    push(&TOP, &b);
    push(&TOP, &c);
    push(&TOP, &d);

    printf("%ld\n", *(long *)pop(&TOP));
    printf("%f\n", *(float *)pop(&TOP));
    printf("%c\n", *(char *)pop(&TOP));
    printf("%d\n", *(int *)pop(&TOP));
}
虽然它本应打印以下内容:

100
90
80
70
60
50
40
30
20
10
0
我知道为什么会这样。这是因为我们传递的是存储
count
变量的地址,而不管它包含什么值。因此,我们将最后一个值推送到堆栈中10次

但是当我修改我的
main.c
时,如下所示:

100
100
100
100
100
100
100
100
100
100
100 
#include <stdio.h>
#include "Stack.h"

int main() {

    Stack *TOP = NULL;
    int a = 5;
    char b = 'A';
    float c = 15.98;
    long d = 225678460;


    push(&TOP, &a);
    push(&TOP, &b);
    push(&TOP, &c);
    push(&TOP, &d);

    printf("%ld\n", *(long *)pop(&TOP));
    printf("%f\n", *(float *)pop(&TOP));
    printf("%c\n", *(char *)pop(&TOP));
    printf("%d\n", *(int *)pop(&TOP));
}
如何修改我的第一个
main.c
,以获得第二个
main.c
中所需的输出

提前感谢您对我编程生涯的最大帮助。这是我的大学项目。

因为堆栈包含指向值的指针,而不是文本值,所以必须在不同的地址保存这些值。如果在循环中只使用一个变量,则将所有这些值依次存储到同一地址中。因此,堆栈上的所有节点都指向该地址

为了解决这个问题,您可以在堆上为每个值分配内存。像这样:

for(count = 0; count < 100; count += 10) {
    int *ptr = malloc(sizeof(int));
    *ptr = count;
    push(&TOP, (void*)ptr);
}
for(计数=0;计数<100;计数+=10){
int*ptr=malloc(sizeof(int));
*ptr=计数;
推送(顶部,(空隙*)ptr);
}
在您的情况下,在堆栈上打印值后,您将立即退出,因此您可以在不占用分配内存的情况下离开。当程序退出时,它将全部释放。但如果在实际程序中实际执行类似操作,请确保在不再需要时释放为每个值分配的内存。或者,更现实地说,如果您想要的是一个整数堆栈,只需让每个节点持有一个
int
,而不是一个空指针。

因为堆栈持有指向值的指针,而不是文本值,所以您必须在不同的地址持有这些值。如果在循环中只使用一个变量,则将所有这些值依次存储到同一地址中。因此,堆栈上的所有节点都指向该地址

为了解决这个问题,您可以在堆上为每个值分配内存。像这样:

for(count = 0; count < 100; count += 10) {
    int *ptr = malloc(sizeof(int));
    *ptr = count;
    push(&TOP, (void*)ptr);
}
for(计数=0;计数<100;计数+=10){
int*ptr=malloc(sizeof(int));
*ptr=计数;
推送(顶部,(空隙*)ptr);
}
在您的情况下,在堆栈上打印值后,您将立即退出,因此您可以在不占用分配内存的情况下离开。当程序退出时,它将全部释放。但如果在实际程序中实际执行类似操作,请确保在不再需要时释放为每个值分配的内存。或者,更现实地说,如果您想要的是一个整数堆栈,只需让每个节点持有一个
int
,而不是一个空指针。

因为堆栈持有指向值的指针,而不是文本值,所以您必须在不同的地址持有这些值。如果在循环中只使用一个变量,则将所有这些值依次存储到同一地址中。因此,堆栈上的所有节点都指向该地址

为了解决这个问题,您可以在堆上为每个值分配内存。像这样:

for(count = 0; count < 100; count += 10) {
    int *ptr = malloc(sizeof(int));
    *ptr = count;
    push(&TOP, (void*)ptr);
}
for(计数=0;计数<100;计数+=10){
int*ptr=malloc(sizeof(int));
*ptr=计数;
推送(顶部,(空隙*)ptr);
}
在您的情况下,在堆栈上打印值后,您将立即退出,因此您可以在不占用分配内存的情况下离开。当程序退出时,它将全部释放。但如果在实际程序中实际执行类似操作,请确保在不再需要时释放为每个值分配的内存。或者,更现实地说,如果您想要的是一个整数堆栈,只需让每个节点持有一个
int
,而不是一个空指针。

因为堆栈持有指向值的指针,而不是文本值,所以您必须在不同的地址持有这些值。如果在循环中只使用一个变量,则将所有这些值依次存储到同一地址中。因此,堆栈上的所有节点都指向该地址

为了解决这个问题,您可以在堆上为每个值分配内存。像这样:

for(count = 0; count < 100; count += 10) {
    int *ptr = malloc(sizeof(int));
    *ptr = count;
    push(&TOP, (void*)ptr);
}
for(计数=0;计数<100;计数+=10){
int*ptr=malloc(sizeof(int));
*ptr=计数;
推送(顶部,(空隙*)ptr);
}

在您的情况下,在堆栈上打印值后,您将立即退出,因此您可以在不占用分配内存的情况下离开。当程序退出时,它将全部释放。但如果在实际程序中实际执行类似操作,请确保在不再需要时释放为每个值分配的内存。或者,更现实地说,如果您想要的是一个整数堆栈,只需让每个节点持有一个
int
,而不是一个空指针。

您的问题是堆栈持有的是计数地址。您正在使用地址而不是值初始化堆栈*(PTR->数据)=*数据;我认为现在应该工作了,它应该更新数据字段中的值,而不是地址。您现在也需要为数据字段分配内存…

您的问题是堆栈中保存的是count的地址。您正在使用地址而不是值初始化堆栈*(PTR->数据)=*数据;我认为现在应该工作了,它应该更新数据字段中的值,而不是地址。您现在也需要为数据字段分配内存…

您的问题是堆栈中保存的是count的地址。您正在使用地址而不是值初始化堆栈*(PTR->数据)=*数据;我认为现在应该工作了,它应该更新数据字段中的值,而不是地址。您现在也需要为数据字段分配内存…

您的问题是堆栈中保存的是