Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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
(在C中)使用数组实现堆栈-数组大小加倍时的运行时错误_C_Arrays_Stack_Double_Runtime Error - Fatal编程技术网

(在C中)使用数组实现堆栈-数组大小加倍时的运行时错误

(在C中)使用数组实现堆栈-数组大小加倍时的运行时错误,c,arrays,stack,double,runtime-error,C,Arrays,Stack,Double,Runtime Error,当数组已满时,我在doublestack()函数中使用realloc()将其加倍。这样做超过两次会导致运行时错误。 我想这可能是因为原始堆栈(使用create()函数创建)的大小仍然相同,所以我也将其翻了一番,并且消除了运行时错误 我的问题是: 这到底是怎么回事?每次阵列加倍时,堆栈是否需要加倍 如果是,为什么最初的堆栈能够支持对doublestack()的第一次和第二次调用 你能不能给我一个图形/内存映射解释一下,当我们realloc()数组和堆栈时到底发生了什么 我是在浪费记忆吗?是否有更好

当数组已满时,我在doublestack()函数中使用realloc()将其加倍。这样做超过两次会导致运行时错误。 我想这可能是因为原始堆栈(使用create()函数创建)的大小仍然相同,所以我也将其翻了一番,并且消除了运行时错误

我的问题是:

  • 这到底是怎么回事?每次阵列加倍时,堆栈是否需要加倍

  • 如果是,为什么最初的堆栈能够支持对doublestack()的第一次和第二次调用

  • 你能不能给我一个图形/内存映射解释一下,当我们realloc()数组和堆栈时到底发生了什么

  • 我是在浪费记忆吗?是否有更好的方法使用数组实现堆栈

  • 非常感谢你抽出时间

    代码和输出:(Uncomment,其中表示使用realloc()取消对双堆栈大小的注释)

    输出2:(堆栈加倍且无错误)


    我怀疑你可能在某处覆盖了你的缓冲区。。。并破坏了垃圾堆

    检查正在写入“堆栈”的代码


    也:考虑使用.

    至少,我的编译器报告两个警告:

    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**