c - RAM 中如何看待整数?

标签 c arrays int

我的意思是 int 实际上是内存中的一个 4 字节“盒子”(嗯,几乎总是 4 字节),但是它们如何彼此区分?好吧,我猜因为它们是 32 位长,所以编译器知道在每个 32 位之后另一个 int 启动等等(这只是一个假设,所以如果我错了请纠正我)但然后它我想到,整数数组如何与其他整数数组和其他整数区分开来,即编译器如何知道整数数组何时开始和结束?

例如,字符串由\0 字符分隔,但对于整数和整数数组会发生什么?

也许我还不清楚我想问的意思:我问,如果我们有一个数组,比如说 3 个整数,假设它们在内存中从 0x145 到 0x151。现在假设从0x151到0x155还有另一个int。编译器如何知道从 0x151 到 0x155 的 int 不是数组的一部分?因此,如果我们尝试通过括号表示法访问它,可能会引发段错误?

最佳答案

如果你想清楚地理解这个概念,你应该学习计算机体系结构类(class),或者阅读计算机体系结构书籍。它将揭开计算机工作原理的许多神秘面纱。

但对于一个简单的答案:计算机通过指针知道数组从哪里开始,指针本质上是表示内存中地址的值。该指针存储在内存中的另一个位置,该位置由操作系统分配。

<小时/>

它知道在哪里访问索引整数,因为它知道每个整数的确切长度,并且它假设数组中的元素是连续的。

因此,如果你有 32 位 int,并且第一个 int 位于地址 A,那么下一个 int 将位于 A 之后 32 位的地址。

<小时/>

根据我的经验,您的程序本身实际上并不知道数组在 c 中结束。这就是为什么如果程序员实际上没有跟踪它,您有时会看到看起来像来自其他数组的数据和来自应用程序中其他位置的其他值的工件出现在数组中。这也是为什么您的编译器将允许您访问未分配给程序的值(在这种情况下,您将在运行时遇到段错误)

关于c - RAM 中如何看待整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27384666/

相关文章:

c - 文件描述符表和系统调用

c - 理解给定递归函数的目的和区别

java - 从抽象类和子类java创建对象数组

java - 如何将用户输入添加到我的 Java 程序中以便在 if 语句中使用

python - 字符串和整数之间的转换。 Python

c - 如何命名一个好的/有意义的类型?

c - 处理像 ls -l/somedir 这样的命令

javascript - 如何从数组存储访问 JS 函数?

javascript - 有人可以解释一下函数中的一行代码吗

java - 为什么在一种情况下乘以大数会得出错误的结果?