尝试用指针和malloc构建堆栈。意外输出C
所以我尝试用C语言构建一个堆栈,使用指针和malloc 我的stack.h有一个结构尝试用指针和malloc构建堆栈。意外输出C,c,pointers,malloc,C,Pointers,Malloc,所以我尝试用C语言构建一个堆栈,使用指针和malloc 我的stack.h有一个结构 typedef struct { int *top; int *prev; } intstack_t; 我正在初始化堆栈,如下所示: int stackInit(intstack_t* self) { if(malloc(sizeof(self != NULL))) { self->top = malloc(sizeof(self->top)); se
typedef struct
{
int *top;
int *prev;
} intstack_t;
我正在初始化堆栈,如下所示:
int stackInit(intstack_t* self) {
if(malloc(sizeof(self != NULL))) {
self->top = malloc(sizeof(self->top));
self->prev = malloc(sizeof(self->prev));
return 0;
} else {
return 1;
}
}
void stackPush(intstack_t* self, int i) {
self->prev = self->top;
self->top = newElement(i);
}
int stackPop(intstack_t* self) {
int tmp = *self->top;
free(self->top);
self->top = self->prev;
return tmp;
}
int *newElement(int i) {
int *new = malloc(sizeof(i));
*new = i;
return new;
}
我的主要意见是:
int main()
{
intstack_t stack;
stackInit(&stack);
stackPush(&stack, 1);
stackPush(&stack, 2);
stackPush(&stack, 3);
stackPop(&stack);
printf("stackTop: %i \n", stackTop(&stack));
stackPop(&stack);
printf("stackTop: %i \n, stackTop(&stack));
}
虽然我可以推到堆栈上,但只有第一个pop会产生所需的输出。当我再次弹出时,结果完全不同
stackTop: 0
stackTop: 1
stackTop: 2
stackTop: 3
stackTop: 2
stackTop: 34792624
谁能给我指出正确的方向,因为我看不出我错在哪里 一个基本问题是
struct intstack\t
不包含任何指向intstack\t
堆栈中前一个元素的指针。它只包含指向两个int
s的指针。也就是说,堆栈的实现不能存储超过两个int
。一个基本问题是struct intstack\t
不包含指向堆栈中上一个元素intstack\t
的任何指针。它只包含指向两个int
s的指针。也就是说,堆栈的实现不能存储超过两个int
s。
是无意义代码。我甚至无法理解你在这里的意图。您需要将分配的数据存储在某个位置,if(malloc(sizeof(self!=NULL))
是布尔表达式的大小sizeof(self!=NULL)
- 在
内部,您不会将分配的指针返回给调用者,因此无论您在该函数内部执行什么操作,它都不会返回给调用者intstackinit(intstack\t*self)
- 不清楚为什么必须首先动态分配堆栈本身<代码>内部堆栈\u t堆栈在调用
stackInit(&stack)之前,code>已在堆栈(程序的堆栈)上分配此变量代码>
- 必须释放分配的()内存
是无意义代码。我甚至无法理解你在这里的意图。您需要将分配的数据存储在某个位置,if(malloc(sizeof(self!=NULL))
是布尔表达式的大小sizeof(self!=NULL)
- 在
内部,您不会将分配的指针返回给调用者,因此无论您在该函数内部执行什么操作,它都不会返回给调用者intstackinit(intstack\t*self)
- 不清楚为什么必须首先动态分配堆栈本身<代码>内部堆栈\u t堆栈在调用
stackInit(&stack)之前,code>已在堆栈(程序的堆栈)上分配此变量代码>
- 必须释放分配的()内存
等等。总的来说,代码毫无意义。您似乎试图通过尝试和错误编程来编写此程序,但这是行不通的 在
if(malloc(sizeof(self!=NULL))
中,为什么不将malloc()的返回值保存在某个地方?至少你以后需要free()
这样做。我还没想过。显然你是对的,谢谢你指出这一点。为什么你的元素只是整数?您希望如何实现堆栈?作为动态数组还是作为节点的链接列表?(考虑到你的代码有很多malloc
s,我猜是后者。)这个想法是使用一个节点链表。在纸上画出你的数据结构,你就会自己发现你的实现有什么问题。在if(malloc(sizeof(self!=NULL))
中,你为什么不保存malloc()的返回值
在什么地方?至少你以后需要free()
这样做。我还没想过。显然你是对的,谢谢你指出这一点。为什么你的元素只是整数?您希望如何实现堆栈?作为动态数组还是作为节点的链接列表?(考虑到你的代码中有许多malloc
s,我猜是后者。)这个想法是使用一个节点链接列表。在纸上画出你的数据结构,你就会自己发现你的实现有什么问题。