c - 是否要求指向两个不同本地空对象的指针比较不相等?

标签 c language-lawyer

考虑以下方法:

typedef struct {} empty;
typedef struct { char x; } onechar;

void sink2(void* left, void* right);

void pass2empties() {
    empty e1, e2;
    sink2(&e1, &e2);
}

void pass2chars() {
    onechar e1, e2;
    sink2(&e1, &e2);
}

int check2empties() {
    empty e1, e2;
    return (&e1 == &e2);
}

int check2chars() {
    onechar e1, e2;
    return (&e1 == &e2);
}

unsigned sizeofempty() {
    return sizeof(empty);
}

我注意到 clangiccpass2empties< 中为 &e1&e2 传递相同的地址。允许这种行为吗?

clang 的情况下,函数的行为非常奇怪:

int passAndCheck() {
    empty e1, e2;
    empty *left = &e1, *right = &e2;
    sink2(left, right);
    return (left == right);
}

它将相同的指针传递给 sink2,但返回 0 进行直接比较。所以你有这样的情况 left == rightleft != right 对于相同的 leftright .这是允许的吗?

组装can be seen here .

最佳答案

typedef struct {} empty; 行包含语法错误。 C11 6.7.2.1/1 中struct 声明的语法要求大括号包含struct-declaration-list,这不是可选的。

因此,符合标准的编译器必须发出诊断,并且程序的行为未由标准定义。

关于c - 是否要求指向两个不同本地空对象的指针比较不相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50662517/

相关文章:

c - 结构成员初始化之间是否有顺序点?

c - c中全局变量的替代品

c - 如何在C中使用LAME API?有没有简单的例子?

c++ - 复制 std::string 时的 MSVC 12 std::initializer_list 错误

c++ - cast 运算符函数在 g++ 中编译良好,但在其他编译器中则不然。为什么?

C++标准歧义

arrays - C 将指针与结构的二维数组一起使用以及如何使用指针访问它们

c - 我的链接列表中的名称计数函数有什么问题?

c - 关于如何创建一个接受字符串并返回带有日期和时间的字符串的 C 函数的想法

c++ - 书中 "rvalue"和 "rvalue reference"的混淆