c - 比较指针与静态变量的行为是什么?

标签 c pointers static comparison

我读过类似指针相等的内容,如果: 它们都指向相同的地址,或者相同的函数。

它可以与名称相同但地址不同的static 函数一起使用吗?

ma​​in.c:

#include <stdio.h>

extern void *p1;
extern void *p2;

int main() {
    printf("%d\n", p1 == p2);
    return 0;
}

:

static void f() {}

BC:

#include "A.h"
void *p1 = &f;

抄送:

#include "A.h"
void *p2 = &f;

此代码将打印什么,或者可能是未定义的行为?

最佳答案

代码将具有未定义的行为,但正是因为 C 标准没有指定当指向函数的指针转换为指向 void 的指针时会发生什么

将指向函数的指针转换为指向 void 的指针被列为公共(public)扩展 ( C11 J.5.7 ),并且 POSiX 需要它。但是,它可能仍然应该使用显式强制转换。


只有当两个指向函数的指针指向同一个函数 ( C11 6.5.9p6 ) 时,它们才会被比较为相等

Two pointers compare equal if and only [...], both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, [...]

在不同翻译单元中具有内部链接的两个函数是不同的,因此指向它们的指针应该比较不相等;如果保证往返,则同样对它们进行 void * 转换。


我读到的标准是这样的:如果链接器合并具有相同代码的两个定义,则该实现不是一致的。 (C11 6.2.2p2)

关于c - 比较指针与静态变量的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55559947/

相关文章:

java - 泛型类共享静态成员吗​​?

java - public static final 需要初始化但 public final 不需要

c - strcpy where src == dest 是否严格定义?

c - 通过 execve 从 child 调用的排序不会自然终止

c - 错误: Stack around the variable 'ptemp' was corrupted

c - 如何增加取消引用的双指针?

c - 从用户那里获取字符串的更好方法

c - 在 C 中排序链表的问题

c - 如何修复 C 中的 "incompatible pointer type"错误?

java - 公共(public)静态方法 howMany