相关疑难解决方法(0)

不相关指针的相等比较可以评估为真吗?

关于和运营商的C标准第6.5.9节规定如下:==!=

2下列之一应持有:

  • 两个操作数都有算术类型;
  • 两个操作数都是指向兼容类型的限定或非限定版本的指针;
  • 一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的void的指针; 要么
  • 一个操作数是一个指针,另一个是空指针常量.

...

6 两个指针比较相等,当且仅当两个都是空指针时,两者都是指向同一对象的指针(包括指向对象的指针和在其开头的子对象)或函数,两者都是指向同一对象的最后一个元素的指针数组对象,或者一个是指向一个数组对象末尾的指针,另一个是指向不同数组对象的开头的指针,该数组对象恰好跟随地址空间中的第一个数组对象.109)

7出于这些运算符的目的,指向不是数组元素的对象的指针与指向长度为1的数组的第一个元素的指针的行为相同,其中对象的类型为其元素类型.

脚注109:

109)两个对象在内存中可能相邻,因为它们是较大数组的相邻元素或结构的相邻成员,它们之间没有填充,或者因为实现选择放置它们,即使它们是不相关的.如果先前的无效指针操作(例如数组边界外的访问)产生了未定义的行为,则后续比较也会产生未定义的行为.

这似乎表明您可以执行以下操作:

int a;
int b;
printf("a precedes b: %d\n", (&a + 1) == &b);
printf("b precedes a: %d\n", (&b + 1) == &a);
Run Code Online (Sandbox Code Playgroud)

这应该是合法的,因为我们使用地址一个元素超过数组的末尾(在这种情况下是一个被视为大小为1的数组的单个对象),而不解除引用它.更重要的是,1如果一个变量在内存中紧跟另一个变量,则需要输出这两个语句中的一个.

但是,测试似乎没有把它弄平.鉴于以下测试计划:

#include <stdio.h>

struct s {
    int a;
    int b;
};

int main()
{
    int a;
    int b;
    int *x = &a;
    int *y = &b;

    printf("sizeof(int)=%zu\n", …
Run Code Online (Sandbox Code Playgroud)

c pointers language-lawyer

37
推荐指数
4
解决办法
1137
查看次数

指针算法是否仍在数组外工作?

我总是在读取指针算法的定义,只要你不离开数组的边界即可.我不确定我完全理解这意味着什么,我有点担心.因此这个问题.

假设我从一个指向数组开头的指针开始:

int *p = (int*) malloc(4 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

现在我创建了两个位于数组边界之外的新指针:

int *q = p + 10;
int *r = p - 2;
Run Code Online (Sandbox Code Playgroud)

现在指针q-10,q-9..., ,r+2,r+3等所有的谎言数组的边界内.它们有效吗?例如,r[3] 保证给出相同的结果p[1]

我做了一些测试,它的工作原理.但我想知道这是否适用于通常的C规范.具体来说,我使用的是Visual Studio 2010,Windows,而且我使用的是原生C(非C++)编程.我被覆盖了吗?

c arrays pointers language-lawyer

9
推荐指数
2
解决办法
1000
查看次数

标签 统计

c ×2

language-lawyer ×2

pointers ×2

arrays ×1