问题标签 [data-segment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
109 浏览

c - 尺寸效用的奇怪行为

第一种情况:

尺寸输出:

第二种情况:

尺寸输出:

理想情况下应该是:

第三种情况:

尺寸输出:

这是对的

为什么第二种情况下的输出不正确?

0 投票
2 回答
1318 浏览

assembly - 汇编器中有两个堆栈?

我正在使用 8086 汇编器进行编码,遇到了一个有趣的问题。主题是评估括号。如果这是Javaor中的一个问题C,我将简单地定义两个堆栈 - 一个用于数字,另一个用于操作数。我可以做类似的事情Assembly吗?据我所知,堆栈是在数据段的最后一个内存单元中定义的。如果我定义另一个数据段,我会有另一个可用的堆栈吗?

另一个信息:我不知道一开始的输入大小,我应该使程序尽可能高效。

谢谢!

0 投票
2 回答
3733 浏览

c - 数据段与堆栈

全局变量分配在数据段中,而局部变量则留在堆栈中。我知道访问存储在堆中的变量比访问局部变量要慢,但我不知道访问局部变量是否比访问全局变量快。它取决于编译器吗?差异是否显着?

0 投票
1 回答
979 浏览

c - 如果需要,分配器可以使用未初始化的数据段来满足堆请求吗?

我是 C 的新手,我对分配器在 C 中可以做什么感到困惑。

正如标题所问,如果需要,分配器可以使用未初始化的数据段来满足堆请求吗?

0 投票
1 回答
236 浏览

c - 目标文件的未初始化变量未显示在 linux size 命令中

使用以下代码创建了一个源文件 test1.c:

使用命令编译以下代码:

使用 size 命令检查各个内存段的大小:

我获得的输出:

而且我发现,每当我在 bss 段上方添加一个全局未初始化变量(如int l )时,它都保持不变。bss 段仅显示那些初始化为 0 的变量。但根据定义,bss 段应包含未初始化的变量。

每当我添加一个初始化的全局指针时,比如:

它将数据段的大小增加了 12 而不是 8(这是我机器上整数指针的大小)。

我的解释有什么问题?

0 投票
1 回答
486 浏览

c++ - 使用 MapViewOfFile 分配静态共享内存

如何将共享内存分配给如下所示的静态缓冲区,但使用 CreateFileMapping 和 MapViewOfFile。

目标是创建一个在 C++ 和 FORTRAN 应用程序之间共享的静态共享缓冲区,就像使用data_seg. 创建动态分配的缓冲区时,FORTRAN 变得很棘手,因为您需要取消引用指针,这也是可行的,但这不是我想要的。

0 投票
2 回答
353 浏览

c++ - 识别 Win32/Win64 中的数据段

我是某个进程的内存空间中加载的DLL。我是此过程中存在的许多 DLL 的一部分,有些是动态加载的,有些是静态加载的。

有一个“数据宝石”让我在这个进程空间的某个地方发现,我们假设它在一个“数据”段中(即不是在一些奇怪的自我修改代码中)。

我需要找到它。我需要搜索内存,例如做一个 memcmp() 但我不知道从哪里开始寻找。也许我可以从 0 到 many-gigs 进行暴力搜索,但这会引发读取访问或仅执行异常,也许我将能够处理这些异常,这样我就不会降低整个过程。但这听起来很狡猾。

有没有更智能的搜索方式?在我的脑海中,我可以查看主进程的数据段,因为有一种方法可以从 NT 标头中获取地址范围,而且我确实知道我已经加载的进程。然后我可以枚举所有加载的 DLL 并查看它们的空间。

谁能建议一种方法,甚至告诉我我是否走在正确的轨道上?

0 投票
0 回答
1471 浏览

linux - 在 Linux 中的汇编 x86_64 中的声明处获取字符串长度

参见 and 的语句string1以及string2它们的len1and len2。代码是使用GNU 汇编器的 x86_64汇编,传递参数以调用Linux x86_64 系统调用。当我奇怪地在执行中生成一个无意义的值()。但是,当我工作正常时。前者作为参数,后者作为参数。mov len1, %rdx8390045993705406470mov len1, %rdimovsys_writesys_exit

代码:( foo.s)

编译:

执行:

如果我删除string2并且len2它有效。

实际上,完整的代码是要创建文件/tmp/foo.txt并在其中写入一些文本。总之:在标准输出中写一条消息;打开文件; 在里面写点东西;关闭它;退出进程。

内核版本:

对象转储输出:

关于如何克服这个问题的任何想法?

0 投票
1 回答
37 浏览

c - 每个静态和全局(未初始化/初始化变量)的数据段内存分配不正确

我试图了解内存分配如何适用于任何执行或编译的 C 代码。

我编写了以下 5 个单独的小代码,它们将帮助我理解内存分配过程。

  1. 段大小1.c

    /li>
  2. 段大小2.c

    /li>
  3. 段大小3.c

    /li>
  4. 段大小4.c

    /li>
  5. 段大小5.c

    /li>

根据我的理解,如果我们编译上面的文件,那么在编译segment_size2.c后BSS大小应该增加4个字节,编译segment_size3.c后数据大小应该增加4个字节。但是当我点击 size 命令时,我得到了以下结果,

在这里我们可以清楚地看到编译segment_size3后bss和data段同时更新。这怎么可能?

0 投票
2 回答
228 浏览

c - C(64 位)中的内存分配布局问题

我想了解“C”程序如何运行并将数据存储在机器中。所以我从这里查看了 C 的内存布局,并在我的 64 位机器上遵循了相同的指令。

首先,当我编写程序(main只有return 0;)并使用size可执行文件的命令时:它在文本和数据段中显示出很多差异。

但在上面提到的网站上显示:

第一个问题: 负责内存分配的因素(硬件/软件)是什么?dec布局中指的是什么?/问题到此结束

但首先我忽略了这一点并开始声明变量(全局和静态)以查看它们的存储位置。我在这个阶段面临一个问题。

对于此代码:

我得到的输出为:

那是因为我声明(未初始化)一个全局变量,这就是为什么将 16 个字节(int-64bit)的内存块添加到它bss所以它从 2640 变成 2656(第一个示例)我理解这一点。

Q2:但是当我添加static int x它时,它不再添加内存块bss。这是预期的吗?

Q3:最后当我用 初始化全局变量时20data增加(预期)并且dec也增加了为什么?

我知道我在这里问了很多问题,但我想知道这种内存管理在 C 中是如何工作的。

阿里加托:)