(在C中)使用数组实现堆栈-数组大小加倍时的运行时错误
当数组已满时,我在doublestack()函数中使用realloc()将其加倍。这样做超过两次会导致运行时错误。 我想这可能是因为原始堆栈(使用create()函数创建)的大小仍然相同,所以我也将其翻了一番,并且消除了运行时错误 我的问题是:(在C中)使用数组实现堆栈-数组大小加倍时的运行时错误,c,arrays,stack,double,runtime-error,C,Arrays,Stack,Double,Runtime Error,当数组已满时,我在doublestack()函数中使用realloc()将其加倍。这样做超过两次会导致运行时错误。 我想这可能是因为原始堆栈(使用create()函数创建)的大小仍然相同,所以我也将其翻了一番,并且消除了运行时错误 我的问题是: 这到底是怎么回事?每次阵列加倍时,堆栈是否需要加倍 如果是,为什么最初的堆栈能够支持对doublestack()的第一次和第二次调用 你能不能给我一个图形/内存映射解释一下,当我们realloc()数组和堆栈时到底发生了什么 我是在浪费记忆吗?是否有更好
我怀疑你可能在某处覆盖了你的缓冲区。。。并破坏了垃圾堆 检查正在写入“堆栈”的代码
也:考虑使用.
至少,我的编译器报告两个警告:
foo.c:40:1: warning: control may reach end of non-void function [-Wreturn-type]
}
^
foo.c:61:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
第一个:
在create()。这意味着您将很快执行一些未定义的行为
第二条:
在doublestack()
中,您从不返回任何内容,但也从不尝试使用(丢失的)返回值。但是,如果realloc成功,那么前一个指针现在可能是无效指针,这将导致未定义的行为。s->capacity
存储堆栈中的项目数。每个项目的大小为sizeof(int)
。realloc的第二个参数是字节数,就像malloc
一样
s->array=realloc(s->array,s->capacity);
你想要
s->array=realloc(s->array, s->capacity * sizeof(int));
或者更一般地说
s->array = realloc(s->array, s->capacity * sizeof(*(s->array)));
此外,您应该检查realloc
的返回值,并处理发生的任何错误
这段代码毫无意义:
s=realloc(s,(sizeof(struct stack)*2));//**UNCOMMENT THIS TO ELIMINATE ERROR**
首先,如果realloc
决定移动数组,则不会将新的s
返回给调用者。但更重要的是,您需要调整数组的大小,而不是它周围的元数据。取消注释该行隐藏了问题,这只是巧合。您可能应该用c
标记它。编辑并标记。ThanksIt的s->top=s->top+1
或(s->top)+
(参数可选)。不是s->top=s->top++
。从create()返回新堆栈-已修复并已编辑。但是相同的运行时错误仍然存在,除非我将堆栈加倍。这是正确的,如果您的S堆栈指针指向create返回的内容,那么您不知道它指向哪里,因为create不返回堆栈指针。由于您从未重新分配S,它会工作一段时间,但可能不一致。请记住,当您像使用create和doublestack一样将指针传递到函数中时,您只是将表示内存位置的数字复制到函数中,实际上并没有对传入的指针执行任何操作。从doublestack()返回双堆栈-我尝试将双堆栈返回到s,但还是犯了同样的错误。将双堆栈返回到原始堆栈是否有问题?我是否需要在push()中创建一个新的堆栈?我对doublestack()函数的修改是:添加最后一行——“returns;”。我对push()函数的更改是:在if()构造中,将行“doublestack(s);”更改为“s=doublestack(s);”有效!谢谢你的解释。
s->array=realloc(s->array, s->capacity * sizeof(int));
s->array = realloc(s->array, s->capacity * sizeof(*(s->array)));
s=realloc(s,(sizeof(struct stack)*2));//**UNCOMMENT THIS TO ELIMINATE ERROR**