首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言中的内存分段

C语言中的内存分段
EN

Stack Overflow用户
提问于 2011-03-03 09:22:29
回答 3查看 5.7K关注 0票数 5

我在url https://cs.senecac.on.ca/~btp100/pages/content/compu.html上读了一些关于C语言的文章。在“分段”一节中,它说:“管理大量字节寻址的一种逻辑技术是分段。分段将内存的某些区域与其他区域区分开来。例如,操作系统将程序信息存储在专用的分段中。”

我不太明白。

例如,如果我有以下程序:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int x = 4;
    int y = 5;
    printf("%d\n", x+y);
  system("PAUSE");  
  return 0;
}

那么,段代码中存储了什么,段数据中存储了什么,堆栈中存储了什么?请。

非常感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-03 09:28:27

堆栈是您的局部变量(例如x和y)。代码段用于实际执行的二进制代码。最后,数据段用于您的程序使用的值(例如那里的暂停字符串)。

票数 4
EN

Stack Overflow用户

发布于 2011-03-03 09:28:17

这是依赖于编译器的。但总的来说,假设你有一个实际使用分段的操作系统,你的局部变量xy被引用到SS,你的字符串文字"%d\n“和"PAUSE”被引用到DS,而你的实际汇编代码被引用到CS。

票数 2
EN

Stack Overflow用户

发布于 2011-03-03 09:28:20

这个问题是特定于系统的。例如,段描述符也在32位Windows上使用,但用于传统的16位系统以外的其他目的,在16位系统中需要分段以同时引用不同的存储器区域。

当使用32位宽的指针类型时,32位系统可以寻址整个虚拟地址空间,这就是为什么Windows中的fs持有诸如TEB和PEB等特殊结构的密钥。然而,在严格意义上,对于平面内存模型,不需要段寄存器。

示例(Windows特定,32位):

代码语言:javascript
运行
复制
mov eax, dword ptr fs:[18h] ; pointer to TEB
mov eax, dword ptr fs:[30h] ; pointer to PEB

例如,在许多现代系统中,csds指的是同一区域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5175575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档