gpt4 book ai didi

c - 如何确定指针是否等于数组的元素?

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:55 25 4
gpt4 key购买 nike

我有code in Code Reveiw 按预期“工作”,但可能有 UB.

代码有一个相同大小的数组 char名为 GP2_format[] 的数组.检测指针是否format与元素之一的地址具有相同的值 GP2_format[][0] , 下面的代码简单测试了指针是否为 >=最小的元素和<=最伟大的。由于元素的大小为 1,因此无需进一步检查。

const char GP2_format[GP2_format_N + 1][1];
const char *format = ...;

if (format >= GP2_format[0] && format <= GP2_format[GP2_format_N]) Inside()
else Outside();

C11 §6.5.8/5 关系运算符 < > <= >=在比较来自数组外部的指针时,似乎将此定义为可怕的未定义行为

When two pointers are compared, the result depends on the relative locations in the address space of the objects pointed to. If two pointers to object types both point to the same object, ... of the same array object, they compare equal. ...(same object OK) .... (same union OK) .... (same array OK) ... In all other cases, the behavior is undefined.


Q1 Is code's pointer compare in GP2_get_type() UB?
Q2 If so, what is a well defined alternate, search O(1), to the questionable GP2_get_type()?

较慢的解决方案
代码可以顺序测试 format针对每个GP2_format[]或将值转换为 intptr_t ,排序一次并进行 O(ln2(n)) 搜索。

相似
...if a pointer is part of a set ,但这个“集合”不是随机的,它是一个数组。
intptr_t approach - 也许是 UB。

#include <stdio.h>

typedef enum {
GP2_set_precision,
GP2_set_w,
GP2_setios_flags_,
GP2_string_,
GP2_unknown_,
GP2_format_N
} GP2_type;

const char GP2_format[GP2_format_N + 1][1];

static int GP2_get_type(const char *format) {
// candidate UB with pointer compare
if (format >= GP2_format[0] && format <= GP2_format[GP2_format_N]) {
return (int) (format - GP2_format[0]);
}
return GP2_format_N;
}

int main(void) {
printf("%d\n", GP2_get_type(GP2_format[1]));
printf("%d\n", GP2_get_type("Hello World")); // potential UB
return 0;
}

输出(符合预期,但可能是 UB)

1
5

最佳答案

如果您想遵守 C 标准,那么您的选择是:

  • 对目标范围内的每个指针执行单独的 ==!= 测试
    • 如果集合非常大,您可以使用哈希表或搜索树或其他东西来加快速度
  • 重新设计您的代码以不需要此检查。

“可能有效”的方法是将所有值转换为 uintptr_t,然后进行关系比较。如果系统具有绝对排序的内存模型,那么它应该定义 uintptr_t 并保留该排序;如果它没有这样的模型,那么关系比较的想法无论如何都不会奏效。

关于c - 如何确定指针是否等于数组的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35163807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com