jok*_*oon 0 c heap stack operating-system
char * s;
s[400] = 'd';
Run Code Online (Sandbox Code Playgroud)
如果它不是未定义的行为,那么这是否意味着我不能随意访问堆栈外部RAM的任何部分?所以每次操作系统启动一个进程时,它都会分配一个RAM区域,我可以在那里做一些讨厌的东西(mallocs除外),因为操作系统会在进程完成后清理堆栈.
为什么操作系统在进程结束后无法清理堆?这是否意味着堆与所有其他进程共享?
如果我在堆栈中放入太多数据,那就是缓冲区溢出,但是我可以放入多少堆栈?是OS绑定,RAM大小绑定还是CPU缓存绑定?
是的,它的行为是不确定的.
s没有初始化,s[400]充其量只是内存中的一些不确定的位置.
编辑:
你问题的最后三段与我们一直在讨论的两行代码几乎没有任何关系.的undefinedness s[400] = 'd';有很少或没有做堆栈,堆,进程,或其他任何东西. s是未初始化的,所以它包含垃圾; 它可能指向记忆中的任何地方,或无处可寻. s[400]最好是一个char对象,它位于由存储的垃圾地址指定的未定义位置400字节之外s.
如果您了解这一点,您可能仍有疑问.我建议在没有代码示例的情况下发布一个新问题.
要部分地回答一些你问什么:
您的程序可能无法合法地尝试访问任何不属于其创建的对象的内存(通过类似对象定义char foo[1000];或通过分配等char *ptr = malloc(1000);).在一个特定的实现中,在任何声明的对象之外可能存在一些内存区域,你可以通过它们来玩,但是没有安全或可移植的方法这样做 - 并没有充分的理由.如果需要访问某些内存,请先进行分配.
C语言本身甚至不引用"堆栈"或"堆"; 这些是实施细节.
不,堆通常不在进程之间共享.通常,当程序完成时,操作系统会整齐地回收所有堆栈分配和堆分配的内存.(C标准并没有这样说,因为它只关注程序执行之外发生的事情,但它几乎普遍存在,除非在一些嵌入式系统中.)
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |