C 如何使void指针按照下面描述中的要求工作?
我正在尝试用C程序实现一个堆栈。 这是我的程序的头文件,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
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->数据)=*数据;我认为现在应该工作了,它应该更新数据字段中的值,而不是地址。您现在也需要为数据字段分配内存…您的问题是堆栈中保存的是