当前位置: 首页 > 知识库问答 >
问题:

C或C是否保证数组

楚硕
2023-03-14

假设您有一个数组:

int array[SIZE];

int *array = new(int[SIZE]);

C或C是否保证数组

我知道,不管语言规范如何,许多操作系统都通过为内核保留虚拟地址空间的顶部来保证这一特性。我的问题是,语言是否也能保证这一点,而不仅仅是绝大多数实现。

举个例子,假设一个操作系统内核处于低内存中,并且有时会响应对匿名内存的mmap请求,将虚拟内存的最高页面给用户进程。如果malloc::操作员new[]直接调用mmap来分配一个巨大的数组,并且数组的末尾紧靠虚拟地址空间的顶部,使得数组SIZE环绕为零,这是否相当于该语言的不兼容实现?

澄清

请注意,问题不是询问数组(SIZE-1),后者是数组最后一个元素的地址。该值保证大于数组。这个问题是关于一个超过数组末尾的指针,或者当p是一个指向非数组对象的指针时,也是p1(所选答案所指的标准部分明确说明了这一点,并以同样的方式处理)。

Stackoverflow要求我澄清为什么这个问题与这个问题不同。另一个问题是如何实现指针的总排序。另一个问题本质上归结为一个库如何实现std::less,这样它甚至可以用于指向不同分配对象的指针,该标准称,这些对象只能进行相等比较,而不能大于或小于相等。

相比之下,我的问题是,一个超过数组末尾的值是否总是保证大于数组。我的问题的答案是“是”还是“否”,实际上并不会改变如何实现std::less,所以另一个问题似乎并不相关。如果与超过数组末尾的一个进行比较是非法的,那么在这种情况下,std::less可能只是表现出未定义的行为。(此外,标准库通常由与编译器相同的人实现,因此可以自由利用特定编译器的属性。)


共有3个答案

班思源
2023-03-14

该保证不适用于int*array=new(int[SIZE])的情况 SIZE为零时,代码>为零。

new int[0]的结果必须是一个有效的指针,可以添加0,但在这种情况下,array==array SIZE,严格小于测试将产生false

梁勇
2023-03-14

C要求这样做。第6.5.8节第5段说:

指向下标值较大的数组元素的指针比指向下标值较低的相同数组元素的指针大

我相信C规范中也有类似的东西。

这一要求有效地防止了在公共硬件上分配环绕地址空间的对象,因为要实现有效实现关系运算符所需的所有簿记是不切实际的。

孔欣荣
2023-03-14

是的。摘自第6.5.8节第5段。

如果表达式P指向数组对象的一个元素,而表达式Q指向同一数组对象的最后一个元素,则指针表达式Q 1比较大于P。

表达式array是P。表达式array SIZE-1指向array的最后一个元素,即Q。因此:

array SIZE=array SIZE-11=q1

 类似资料:
  • 问题内容: 最近有人问我关于涵盖 C / C ++和Java的代码库的Coverage Prevent的替代方法。显然,在Java方面,可用的免费工具包括Findbugs(编译代码分析)和PMD(静态代码分析)。它们非常强大,尤其是当您开始研究与IDE的集成时(它们又是免费的)。 但是,当您开始使用各种编译器,体系结构等进入C / C ++领域时,事情变得扑朔迷离。 我已经为Java端提出了多种工

  • 显然,C#同时处理嵌套表达式和链式表达式。如果嵌套和/或链接是线性的,那么很明显表达式的计算顺序是: 只能按以下顺序计算: 但如果筑巢不是线性的呢?考虑: 显然,以下内容必须是正确的: 在之前 在之前 之前的 但目前尚不清楚何时会评估。以下任何一项都是可行的命令: 可能性#1 我的直觉是,第三种选择可能是正确的。i、 e.在开始评估任何 虽然我当然可以测试个人情况,看看会发生什么,但这并不能告诉我

  • 问题内容: 我真的是在这里指身份平等。 例如,以下内容将始终打印 true 吗? 问题答案: 是的,类令牌是唯一的(对于任何给定的类加载器而言)。 即,您将始终 在相同的类加载器领域中 获得对相同物理对象的引用。但是,不同的类加载器将加载不同的类令牌,同时,当两个不同的类加载器加载相同的类定义时,会将相同的类定义视为不同。

  • 问题内容: 考虑以下代码: 当第一个URL够用时会被要求输入第二个URL吗? 我尝试了一个较小的示例,它看起来像预期的那样工作。即一个一个地处理数据,但是可以依靠这种行为吗?如果没有,在帮助之前打电话吗? 输出: 更新 :如果对实施很重要,请使用官方Oracle JDK8 答案 :根据下面的评论和答案,flatmap部分是惰性的。即完全读取第一个流,并且仅在需要时才读取下一个。渴望读取一个流,但是

  • 问题内容: 我目前正在决定要在其上构建科学计算产品的平台,并且正在决定在Core2 Quad CPU上使用C#,Java或带有Intel编译器的纯C语言。它主要是整数运算。 到目前为止,我的基准测试表明Java和C彼此差不多,并且.NET / C#落后大约5%,但是我的许多同事都声称经过适当的优化的.NET将在足够的时间上击败这两个方面。供JIT开展工作。 我一直以为JIT会在应用启动后的几分钟内

  • 本文向大家介绍C#验证给定字符串是否为数字的方法,包括了C#验证给定字符串是否为数字的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#验证给定字符串是否为数字的方法。分享给大家供大家参考。具体分析如下: 这段C#代码用于验证给定的字符串是否为数字,不能用于验证负数,字符串中只能出现数字和小数点,否则认为不是数字,不验证数字的长度,也就是说,给定的字符串再长,哪怕是1万个字符,也可以