c语言堆栈是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言堆栈是啥意思?相关的知识,希望对你有一定的参考价值。

参考技术A

1、堆栈空间分配

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

2、堆栈缓存方式

栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

3、效率比较

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

4、存储内容

栈: 在函数调用时,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向函数的返回地址,也就是主函数中的下一条指令的地址,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。

扩展资料:

简介

单片机应用中,堆栈是个特殊存储区,堆栈属于RAM空间的一部分,堆栈用于函数调用、中断切换时保存和恢复现场数据。

堆栈中的物体具有一个特性:第一个放入堆栈中的物体总是被最后拿出来, 这个特性通常称为先进后出 (FILO—First-In/Last-Out)。 堆栈中定义了一些操作, 两个最重要的是PUSH和POP。 PUSH(入栈)操作:堆栈指针(SP)加1,然后在堆栈的顶部加入一 个元素。

POP(出栈)操作相反,出栈则先将SP所指示的内部ram单元中内容送入直接地址寻址的单元中(目的位置),然后再将堆栈指针(SP)减1.。这两种操作实现了数据项的插入和删除。

参考资料来源:百度百科-堆栈

进度警告:在过程中超出 -s 堆栈。那是啥意思?

【中文标题】进度警告:在过程中超出 -s 堆栈。那是啥意思?【英文标题】:Progress Warning: -s stack exceeded during procedure. What does that mean?进度警告:在过程中超出 -s 堆栈。那是什么意思? 【发布时间】:2021-12-23 22:46:30 【问题描述】:

我遇到了以前从未见过的警告。

这是我在运行简单程序时收到的消息:

我的程序如下:

    从文件中读取ReferenceNumbersfor each 中使用那些ReferenceNumbers 更改Info 字段的值

这是它在代码中的样子:

INPUT FROM VALUE('C:\Users\admin\Desktop\ref\reference.csv').

DEFINE VARIABLE cData AS CHARACTER NO-UNDO.

repeat:
    if keyfunction(lastkey) = "end-error" then leave.
    process events.

    import unformatted cData.

    FOR EACH V_Acct
        WHERE V_Acct.Company = '123'
            AND V_Acct.ReceiptType = 'U'
            AND V_Acct.ReferenceNr = integer(TRIM(ENTRY(1,cData,';')))
            AND V_Acct.xInfo = ''
        EXCLUSIVE-LOCK:
        
        V_Acct.xInfo = 'VGF00000000000000'.

    END. /* for each V_Acct */                                     

END. /* repeat */

从文件中正确读取参考编号(多次确认)。 我过去也更改过同一个数据库表的某些文件,但从未遇到过此错误消息。

有人可以帮我吗?

【问题讨论】:

【参考方案1】:

一个常见的原因是尝试使用长字符变量。 IOW 你可能试图 IMPORT 很长的一行。

https://knowledgebase.progress.com/articles/Article/P79111

-s 并不特定于单个变量(字符变量的限制为 30,000 字节),而是涉及堆栈空间的多种不同用途。所以可能只是因为其他原因你接近了极限,这把你推到了边缘。

-s 的默认值会随时间变化,具体取决于您使用的 OpenEdge 版本,您的应用程序或特定会话也可能设置了更高或更低的非默认值。如果生成了一个 protrace 文件,它会告诉您问题发生时有效的 -s 值。

查找一个名为 protrace.###(其中 ### 是您的进程 ID)的文件,其时间戳与错误相同。这可能在当前工作目录或应用程序的 WRKDIR 中。

【讨论】:

以上是关于c语言堆栈是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

C语言里还有这个符号吗?是啥意思?←→ 这个是啥意思?

C语言里%zd是啥意思?

“C语言是中间语言”,中间语言是啥意思?

c语言中,while(1)是啥意思?

C语言中的序列点是啥意思

c语言的双冒号是啥意思::