gpt4 book ai didi

c - C程序的内存分配

转载 作者:IT王子 更新时间:2023-10-28 23:32:53 27 4
gpt4 key购买 nike

计划

#include<stdio.h>
int a=10;
void main()
{
int i=0;
printf("global = %p, local = %p\n",&a,&i);
main();
}

输出

mohanraj@ltsp63:~/Advanced_Unix/Chapter7$ ./a.out
global = 0x804a014, local = 0xbfff983c
global = 0x804a014, local = 0xbfff980c
.
.
.
global = 0x804a014, local = 0xbf7fac9c
global = 0x804a014, local = 0xbf7fac6c
global = 0x804a014, local = 0xbf7fac3c
Segmentation fault (core dumped)
mohanraj@ltsp63:~/Advanced_Unix/Chapter7$

上述程序出现段错误错误。因为, main 递归地调用自己。以下是记忆分配给 C 程序。

内存分配

          __________________                        __________________  
| | | |
| stack | | Main |
| ↓ | |----------------|
------------------ | Main |
| | |----------------|
| <Un Allocated| | Main |
| space> | |----------------|
------------------ | Main |
| | |----------------|
| ↑ | | Main |
| Heap | |----------------|
| | | Main |
| | |----------------|
__________________ |////////////////| ---> Collision occurs. So, Segmentation fault Occurs.
| | |________________|
| data | | data |
__________________ |________________|
| text | | text |
__________________ |________________|
Figure(a) Figure(b)

所以,我希望如图(b)所示,主要调用递归。如果它到达数据段,就会发生冲突。如果发生,则没有更多空间可分配给 main 函数。因此,它会出现段错误错误。所以我用上面的程序做实验。在该程序中,全局变量“a”的地址是“0x804a014”。每次调用 main 时,都会声明局部变量“i”。所以我预计,在段错误之前,i 的地址几乎是“a”的地址。但是,这两个地址是非常不同的。那么这里发生了什么。

为什么segment fault错误时'a'和'i'的地址不在同一范围内。那么,如何交叉检查是否main 达到堆栈大小并溢出?

最佳答案

您的架构是概念模型或可能的实现。但是例如,一个多线程程序每个线程有一个堆栈和一个堆,这并不真正适合您的简化模式。

所需要的只是系统允许递归,这意味着函数的每次新调用都会获得局部变量的私有(private)副本。剩下的就是依赖于实现了。

最近系统使用页分配,一个进程一般会得到一组页段,但它们不一定是连续的,它们之间可以有空洞,任何访问都会得到一个SIGSEGV(段违规)

TL/DR:您的程序将更有可能获得 SIGSEGV 信号,而不是动态变量的地址到达静态变量的地址 - 您应该找到一个旧的 MS/DOS 框来表现这种行为...

关于c - C程序的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32864428/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com