Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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
尝试用指针和malloc构建堆栈。意外输出C_C_Pointers_Malloc - Fatal编程技术网

尝试用指针和malloc构建堆栈。意外输出C

尝试用指针和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

所以我尝试用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));
        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,我猜是后者。)这个想法是使用一个节点链接列表。在纸上画出你的数据结构,你就会自己发现你的实现有什么问题。