如何修复与C中的动态数组指针/堆栈相关的崩溃?

如何修复与C中的动态数组指针/堆栈相关的崩溃?,c,arrays,pointers,stack,C,Arrays,Pointers,Stack,我正在尝试使用数组指针实现堆栈。当堆栈已满时,它将扩展其原始大小的两倍。当堆栈中存储的元素数为堆栈大小的一半时,它将收缩一半。推就行了。问题是流行音乐。当我在pop中放入testSize时,程序崩溃(请参见光头行)。有人能帮我找人修一下吗 #include <stdio.h> #include "stack.h" #include <stdlib.h> double* initialize(int* top) { *top=0; return (doub

我正在尝试使用数组指针实现堆栈。当堆栈已满时,它将扩展其原始大小的两倍。当堆栈中存储的元素数为堆栈大小的一半时,它将收缩一半。推就行了。问题是流行音乐。当我在pop中放入testSize时,程序崩溃(请参见光头行)。有人能帮我找人修一下吗

#include <stdio.h>
#include "stack.h"
#include <stdlib.h>

double* initialize(int* top)
{
    *top=0;
    return (double*)malloc(sizeof(double)*2);
}
// add a new value to the top of the stack (if not full)
void push(double* stack, int* top, const double new_value, int *stack_size)
{
    *(stack+*top)=new_value;
    ++*top;
    testSize(stack,stack_size,top);
}
// remove (and return) the value at the top of the stack (if not empty)
double pop(double* stack, int* top,int* stack_size)
{
    **//testSize(stack,stack_size,top);**
    if(*top)
    {
        int temp=--*top;
        double result= *(stack+temp);
        **//testSize(stack,stack_size,top);**
        return result;
    }
    printf("%d top \n",*top);
    return 0;
}
void testSize(double *stack, int *stack_size, int * top) //size operation
{
    if(*top==*stack_size) //see if it is full
    {
        stack=(double*)realloc(stack,(*stack_size)*sizeof(double)*2); //expand size reallocate memory
        *stack_size=*stack_size*2;
    }else if(*top<*stack_size/2)
    {
        //shrink
    }
}

#include <stdlib.h>
#include <stdio.h>
#include "stack.h"

int main(int args, char* argv[])
{

  double* my_stack = NULL;
  int my_top = 0;
  int stack_size=2; //initial dynamic array size
  my_stack=initialize(&my_top); //initial size of 2

    int p;
    for(p=0;p<10;++p)
        push(my_stack,&my_top,p+0.1,&stack_size);

    pop(my_stack,&my_top,stack_size);


    printf("%d elements total \nDynamic current stack size %d \n",my_top,stack_size); //summary

//print stack
    int i;
    for(i=my_top-1; i>=0; --i)
    {
        printf("%f \n", *(my_stack+i));
    }

      free(my_stack);
      return 0;
}
#包括
#包括“stack.h”
#包括
双*初始化(整数*顶部)
{
*top=0;
返回(双倍)*malloc(双倍大小)*2;
}
//将新值添加到堆栈顶部(如果未满)
无效推送(双*堆栈、整数*顶部、常数双新值、整数*堆栈大小)
{
*(堆栈+*顶部)=新的_值;
++*顶部;
testSize(堆栈、堆栈大小、顶部);
}
//移除(并返回)堆栈顶部的值(如果不是空的)
双pop(双*堆栈,整数*顶部,整数*堆栈大小)
{
**//testSize(堆栈、堆栈大小、顶部)**
如果(*顶部)
{
int temp=-*顶部;
双结果=*(堆栈+温度);
**//testSize(堆栈、堆栈大小、顶部)**
返回结果;
}
printf(“%d top\n”,*top);
返回0;
}
void testSize(双*stack,int*stack\u size,int*top)//大小操作
{
if(*top==*堆栈大小)//查看是否已满
{
stack=(double*)realloc(stack,(*stack_size)*sizeof(double)*2);//扩展大小重新分配内存
*堆栈大小=*堆栈大小*2;
}否则,如果(*top此行:

pop(my_stack,&my_top,stack_size);
应该是

pop(my_stack,&my_top,&stack_size); /* take address of stack_size with '&' */
我建议您使用
-Wall
选项进行编译,查找警告,然后消除它们。这不仅可以改进您的编码风格,而且可以帮助您快速找到此类内容。

这一行:

pop(my_stack,&my_top,stack_size);
应该是

pop(my_stack,&my_top,&stack_size); /* take address of stack_size with '&' */
我建议您使用
-Wall
选项进行编译,查找警告,然后消除它们。这不仅可以改进您的编码风格,而且可以帮助您快速找到此类内容。

这一行:

pop(my_stack,&my_top,stack_size);
应该是

pop(my_stack,&my_top,&stack_size); /* take address of stack_size with '&' */
我建议您使用
-Wall
选项进行编译,查找警告,然后消除它们。这不仅可以改进您的编码风格,而且可以帮助您快速找到此类内容。

这一行:

pop(my_stack,&my_top,stack_size);
应该是

pop(my_stack,&my_top,&stack_size); /* take address of stack_size with '&' */
我建议您使用
-Wall
选项进行编译,并查找警告,然后消除它们。这不仅可以改进您的编码风格,还可以帮助您快速找到此类内容。

您的
pop()
函数将
int*
作为第三个参数,但您正在以下行中传递一个
int

pop(my_stack, &my_top, stack_size);
应该是:

pop(my_stack, &my_top, &stack_size);
因此,在
testSize()
中,当您尝试取消引用此非指针时,程序将崩溃。

您的
pop()
函数将
int*
作为第三个参数,但您在下一行中传递了
int

pop(my_stack, &my_top, stack_size);
应该是:

pop(my_stack, &my_top, &stack_size);
因此,在
testSize()
中,当您尝试取消引用此非指针时,程序将崩溃。

您的
pop()
函数将
int*
作为第三个参数,但您在下一行中传递了
int

pop(my_stack, &my_top, stack_size);
应该是:

pop(my_stack, &my_top, &stack_size);
因此,在
testSize()
中,当您尝试取消引用此非指针时,程序将崩溃。

您的
pop()
函数将
int*
作为第三个参数,但您在下一行中传递了
int

pop(my_stack, &my_top, stack_size);
应该是:

pop(my_stack, &my_top, &stack_size);

所以在
testSize()中当你试图去引用这个非指针时,程序崩溃了。< /p>为什么你要用C++来调试?你是否尝试过使用调试器,比如GDB?而且,不要使用MalCube调试器,在崩溃的时候,看一个堆栈,为什么要标记为C++?查看变量为什么被标记为C++?并且,你尝试过使用调试器吗?比如GDB?并且,不要使用MalCube调试器,在崩溃的监视下,为什么要用C++来标记一个调试程序?