当我们在C中声明静态向量时,是否存储了指向该向量的指针?

亚历山德罗

我想知道是否

int v [10];

分配(除10 * sizeof(int)个字节之外)也是指向此向量的整数的指针。

埃里克·波斯蒂奇(Eric Postpischil)

有两个概念层次可以理解这个问题。

首先,C是根据抽象机定义的。在此模型中,v标识一个10的数组intv不是指针;“ v”是标识符,它标识的事物名为v10的数组int没有指针。v在源代码中用于表达式而不用于获取其大小(带有sizeof)或地址(带有&)时,它将自动转换为指针。实际上,该指针是根据需要制造的-尚未(在C标准描述的模型中)存储在任何地方或从任何地方加载。它只是在需要时制作的。

其次,当C实现使用数组时,它们具有各种引用内存的方式。如果数组是静态对象(因为它是在任何函数外部定义的),则通常将其放在为静态数据保留的内存段中的某个位置。C实现引用此内存的方式有多种,包括:

  • 编译器将有关其要引用的内存位置的信息放入目标文件。在链接和加载程序时,链接器和加载器会调整此信息,并根据需要更改机器指令,以便它们引用对象的最终地址。这可能会导致指令包含对象的完整绝对地址,或者导致引用该对象的指令距包含基地址的某个寄存器有多远。
  • 加载程序后,加载程序选择将数据放置在内存中的位置,并设置一个寄存器以包含数据的基地址。编译器在编译程序时,会使用偏移量编写引用静态对象的指令,这些偏移量指示对象与该基址的距离。

如果对象是自动的而不是静态的(如在函数内部定义,没有static关键字),则典型的C实现使用堆栈上的内存。此方法类似于上述的基址寄存器和偏移量方法,但是基址寄存器是称为堆栈指针的特殊寄存器,在调用每个函数时会对其进行调整,以指向仅为该特定用途保留的内存函数调用。

每当使用基址寄存器和偏移量方法时,绝对地址就永远不会以程序观察到的方式存在。例如,一条指令可能包含诸如38(sp)(如汇编语言中所述)的位置引用,这意味着“堆栈指针指向的位置超出38个字节”。处理器将获取堆栈指针的内容,向其添加38,然后从内存中获取(如果读取)该位置的内容。在这种情况下,绝对地址会暂时存在于处理器内部的某个位置,在该位置进行38加。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当我们在 blob 中存储 pdf 时,MSSQL 是否存储文件名?

来自分类Dev

当我们寻找向量的所有元素的所有匹配索引时,R中是否存在避免使用循环的函数?

来自分类Dev

当我们在C ++中声明头文件时,为什么不将空格视为空白?

来自分类Dev

当我返回指向结构的指针向量时出现段错误

来自分类Dev

当我们在向量上使用唯一函数时,移位如何工作?

来自分类Dev

存储指向整数向量向量元素的指针向量

来自分类Dev

指向对象的指针向量C ++

来自分类Dev

如何将智能指针的向量转换为常量向量,该向量包含指向常量的智能指针?

来自分类Dev

Scala-当我们将GMM模型与数据拟合到两个单独的列中时,如何将获得的概率列(向量列)分开?

来自分类Dev

指向向量中对象的指针有时指向向量中的其他对象

来自分类Dev

当我们已经有了更强大的向量时,为什么还需要堆栈?

来自分类Dev

当我们将指针打印到字符类型时,为什么C ++显示字符?

来自分类Dev

当我们声明静态变量时,编译器实际上会做什么?

来自分类Dev

我们如何替换R中向量中的元素?

来自分类Dev

如果我们从向量中删除一些元素,向量的结束地址是否会改变,因为在向量中,内存是按顺序分配的(与数组相同)

来自分类Dev

如何访问指向其他向量的指针向量?我在 C++ 中尝试了hackerrank程序可变大小的数组:

来自分类Dev

我们可以在 c++ 的 main 函数中声明一个向量作为模板,如果是的话如何?

来自分类Dev

指向C ++中指针向量的指针

来自分类Dev

当我们想向 DOM 添加方法时,为什么要将 elment 存储在变量中?

来自分类Dev

当我们删除数据时,laravel 如何删除存储中的文件

来自分类Dev

我们如何在C ++中初始化所有值为0的向量

来自分类Dev

为什么我们需要在优先级队列声明中添加一个向量作为参数?

来自分类Dev

vector <list <int>>和list <vector <int>>是否相同当我们声明它们时,它们如何保留在内存中?

来自分类Dev

在C函数中声明向量时出错

来自分类Dev

排序后指向向量中对象的指针(C++)

来自分类Mysql

在SQL中,当我们联接表时,新表是否有名称?

来自分类Dev

当我们使用 group by 时是否可以访问组中的行

来自分类Dev

当我在C ++中存储指向按值传递参数的指针时会发生什么?

来自分类Dev

在 Java 中,当我们将字符串文字打印到终端时,该字符串文字是否也存储在字符串池中?

Related 相关文章

  1. 1

    当我们在 blob 中存储 pdf 时,MSSQL 是否存储文件名?

  2. 2

    当我们寻找向量的所有元素的所有匹配索引时,R中是否存在避免使用循环的函数?

  3. 3

    当我们在C ++中声明头文件时,为什么不将空格视为空白?

  4. 4

    当我返回指向结构的指针向量时出现段错误

  5. 5

    当我们在向量上使用唯一函数时,移位如何工作?

  6. 6

    存储指向整数向量向量元素的指针向量

  7. 7

    指向对象的指针向量C ++

  8. 8

    如何将智能指针的向量转换为常量向量,该向量包含指向常量的智能指针?

  9. 9

    Scala-当我们将GMM模型与数据拟合到两个单独的列中时,如何将获得的概率列(向量列)分开?

  10. 10

    指向向量中对象的指针有时指向向量中的其他对象

  11. 11

    当我们已经有了更强大的向量时,为什么还需要堆栈?

  12. 12

    当我们将指针打印到字符类型时,为什么C ++显示字符?

  13. 13

    当我们声明静态变量时,编译器实际上会做什么?

  14. 14

    我们如何替换R中向量中的元素?

  15. 15

    如果我们从向量中删除一些元素,向量的结束地址是否会改变,因为在向量中,内存是按顺序分配的(与数组相同)

  16. 16

    如何访问指向其他向量的指针向量?我在 C++ 中尝试了hackerrank程序可变大小的数组:

  17. 17

    我们可以在 c++ 的 main 函数中声明一个向量作为模板,如果是的话如何?

  18. 18

    指向C ++中指针向量的指针

  19. 19

    当我们想向 DOM 添加方法时,为什么要将 elment 存储在变量中?

  20. 20

    当我们删除数据时,laravel 如何删除存储中的文件

  21. 21

    我们如何在C ++中初始化所有值为0的向量

  22. 22

    为什么我们需要在优先级队列声明中添加一个向量作为参数?

  23. 23

    vector <list <int>>和list <vector <int>>是否相同当我们声明它们时,它们如何保留在内存中?

  24. 24

    在C函数中声明向量时出错

  25. 25

    排序后指向向量中对象的指针(C++)

  26. 26

    在SQL中,当我们联接表时,新表是否有名称?

  27. 27

    当我们使用 group by 时是否可以访问组中的行

  28. 28

    当我在C ++中存储指向按值传递参数的指针时会发生什么?

  29. 29

    在 Java 中,当我们将字符串文字打印到终端时,该字符串文字是否也存储在字符串池中?

热门标签

归档