这段代码是不确定的行为?OS和堆怎么样?操作系统如何处理堆栈?

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缓存绑定?

Kei*_*son 5

是的,它的行为是不确定的.

s没有初始化,s[400]充其量只是内存中的一些不确定的位置.

编辑:

你问题的最后三段与我们一直在讨论的两行代码几乎没有任何关系.的undefinedness s[400] = 'd';有很少或没有做堆栈,堆,进程,或其他任何东西. s是未初始化的,所以它包含垃圾; 它可能指向记忆中的任何地方,或无处可寻. s[400]最好是一个char对象,它位于由存储的垃圾地址指定的未定义位置400字节之外s.

如果您了解这一点,您可能仍有疑问.我建议在没有代码示例的情况下发布一个新问题.

部分地回答一些你问什么:

您的程序可能无法合法地尝试访问任何不属于其创建的对象的内存(通过类似对象定义char foo[1000];或通过分配等char *ptr = malloc(1000);).在一个特定的实现中,在任何声明的对象之外可能存在一些内存区域,你可以通过它们来玩,但是没有安全或可移植的方法这样做 - 并没有充分的理由.如果需要访问某些内存,请先进行分配.

C语言本身甚至不引用"堆栈"或"堆"; 这些是实施细节.

不,堆通常不在进程之间共享.通常,当程序完成时,操作系统会整齐地回收所有堆栈分配和堆分配的内存.(C标准并没有这样说,因为它只关注程序执行之外发生的事情,但它几乎普遍存在,除非在一些嵌入式系统中.)

  • @gokoon:这不是堆栈,可能是什么.BTW,s [400] ==*(s + 400) (3认同)