c++中两栈共享代码,不知道为什么执行压栈操作的时候会错,代码没有错误可是运行就错,请高手指教;

# include <iostream># include <cstdlib>
using namespace std;
class BothStack
{
public:
BothStack();
~BothStack(){};
void push(int, int);
int pop(int);
bool empty(int);
private:
int *pBase;
int top1;
int top2;
};

BothStack :: BothStack()
{
int *pBase = new int[6];
if (NULL == pBase)
{
cout << "动态内存分配失败!" << endl;
exit(-1);
}

top1 = -1;
top2 = 6;
}

void BothStack :: push(int i, int val)
{
if (top2 == top1 + 1)
{
return;
}
//判断栈是否已满

if (i == 1)
{
pBase[++top1] = val;

return;
}
else if (i == 2)
{
pBase[--top2] = val;

return;
}
}

int main()
{
BothStack S;

S.push(1, 2);//向第1个栈中压2
return 0;}
运行时会弹出这个对话框,

您应该是修改过这个程序的代码的吧?视乎程序不完善呢!
首先,您在类体中有:

private:
int *pBase;
而构造函数BothStack()中又重新定义了一个*pBase,并用新建的数组初始化:
int *pBase=new int[6];
而在push(int i, int val)中您用到了
pBase[++top1] = val;
这里调用的是类体中定义的pBase,但其实您还未对其进行初始化(您只是初始化了构造函数中的那个pBase),所以才会出现错误!
建议您把构造函数中的
int *pBase=new int[6];
改为
pBase=new int[6];
希望能帮到您!
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-03
分太少了。
第2个回答  2012-10-03
报什么错,可以说下么

c++中两栈共享代码,不知道为什么执行压栈操作的时候会错,代码没有错误...
您应该是修改过这个程序的代码的吧?视乎程序不完善呢!首先,您在类体中有:private:int *pBase;而构造函数BothStack()中又重新定义了一个*pBase,并用新建的数组初始化:int *pBase=new int[6];而在push(int i, int val)中您用到了 pBase[++top1] = val;这里调用的是类体中定义的pBase,...

C++中栈与函数调用的关系
第一,它使调用者和被调用者达成某种约定。这个约定定义了函数调用时函数参数的传递方式,函数返回值的返回方式,寄存器如何在调用者和被调用者之间进行共享;第二 ,它定义了被调用者如何使用它自己的 stack frame 来完成局部变量的存储和使用。

1.8.1 堆heap栈stack与指针变量pointer(地址变量)(C++)
使用局部变量定义时,它们存放在栈内存中。在函数执行过程中,栈内存为变量分配空间,变量的生存周期与函数调用同步。当函数调用结束,栈内存中创建的变量也随之消失。堆变量示例 通过new关键字创建的变量被分配到堆内存。堆变量没有名字,但new会返回其地址。通过地址变量,如指针,可以引用堆内存中的变量。

...线程所共享,不明白2个线程如何共享2个对象中的同名变量。_百度知 ...
首先:堆内存共享是相对于栈内存的。栈是每一个线程都独有的,线程之间互不一向,每一个线程都有自己的栈内存。但是堆内存不一样,在一个JVM实例里面,不管你有多少线程,创建了多少对象,都是放在一块堆内存的。也就是说一个JVM实例栈内存区域是有多个,每一个线程持有一个,而堆内存只有一个,是...

手把手教你纯c实现异常捕获try-catch组件
代码实现与解释try 首先创建一个新节点入栈,然后setjmp设置一个标记,接下来就是大括号里面的操作了。如果有异常,那么就会被throw抛出来。为什么这里最后一行是if?因为longjmp的时候,返回的地方是setjmp,不要忘了!要时刻扣住longjmp和setjmp。throw 在这里,我们不应该把throw定义成宏,而应该定义成...

...进栈,两边封住的那种。求高手帮我调试一下,不知道问题出在哪里。_百...
指出你的两个语法问题吧 1、结构体变量不是这样初始化的 Stack p1;p1.top[0]=-1;p1.top[1]=maxsize+1;得改成这样:Stack p1 = {-1,maxsize+1};2、int print(Stack p)函数,你的代码不是每个出口都有返回值的 至于逻辑上是否有啥错误……没看 我做任务来的 ...

蓝屏代码
174 0x00AE 档案系统不支持自动变更锁定类型。 180 0x00B4 系统发现不正确的区段号码。 182 0x00B6 操作系统无法执行 %1。 182 0x00B6 操作系统无法执行 %1。 183 0x00B7 档案已存在,无法建立同一档案。 186 0x00BA 传送的旗号错误。 187 0x00BB 指定的系统旗号找不到。 188 0x00BC 操作系统无法执行 ...

蓝屏代码
174 0x00AE 档案系统不支持自动变更锁定类型。 180 0x00B4 系统发现不正确的区段号码。 182 0x00B6 操作系统无法执行 %1。 182 0x00B6 操作系统无法执行 %1。 183 0x00B7 档案已存在,无法建立同一档案。 186 0x00BA 传送的旗号错误。 187 0x00BB 指定的系统旗号找不到。 188 0x00BC 操作系统无法执行 ...

支持计算机进行工作的指令或程序和运行程序所需的相应数据是...
二、应用程序由于自身BUG引用了不正常的内存指针 在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的内存,但不知为什么,这个预料中可用的指针已经失效了。有可能是“忘记了”向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而“没有留意”等等。注销了的内存被...

代码怎么编写(代码怎么做)
也就是说它们不会和别的任何函数共享。 2.接下来就是根据以上信息进行下面的操作,chunkname在错误消息和调试消息中,用于代码块的名字。?如果不提供此参数,它默认为字符串chunk。chunk不是字符串时,则为"=(load)"。 字符串mode用于控制代码块是文本还是二进制(即预编译代码块)。它可以是字符串"b"(只能是二...

相似回答
大家正在搜