请考虑以下代码片段:
int (*p)[3];
int (*q)[3];
q = p;
q++;
printf("%d, %d\n", q, p);
printf("%d\n", q-p);
Run Code Online (Sandbox Code Playgroud)
我知道指针算法是智能的,这意味着操作q++前进q足够的字节指向下一个3整数数组,所以第一次打印是' 12, 0' 并不意味着递增q使它在12中更大.
但第二次印刷确实令我惊讶.它打印1!
那么为什么它会打印1而不是12?它只是困惑我.
对两个不相关的指针(即不指向同一数组或对象的两个指针)执行算术比较是 C 中未定义的行为。
\nint a, b;\nbool ub = &a < &b;\nRun Code Online (Sandbox Code Playgroud)\n然而,人们可以将它们投射到uintptr_t:
int a, b;\nbool not_ub = (uintptr_t)&a < (uintptr_t)&b;\nRun Code Online (Sandbox Code Playgroud)\n演员表已定义,比较也已定义。
\n但是,使用 比较两个指针是否是UB memcmp?
int a, b;\nint* pa = &a;\nint* pb = &b;\nint maybe_ub = memcmp(&pa, &pb, sizeof(int*));\nRun Code Online (Sandbox Code Playgroud)\nC11 \xc2\xa77.24.4.1 说:
\n\n\nmemcmp 函数将 s1 指向的对象的前 n 个字符与 s2 指向的对象的前 n 个字符进行比较。
\n
我对该摘录的理解是比较的是指针的表示,而不是指针本身。因此,我希望调用不会memcmp表现出任何未定义的行为。
由于标准没有指定对象如何存储或表示(特定情况除外,但不是这里),我对结果不感兴趣memcmp不感兴趣,而只是关心它是否是 UB。
是否减去指向同一数组的不同元素的指针在C中是否有效?
下面的东西是否保证按照C标准工作?我依稀记得读到这是无效的吗?
int * a;
int * b;
a = (int*) 100;
b = (int*) 200;
printf("%d\n", b-a);
Run Code Online (Sandbox Code Playgroud)
这会给我25.
对于下面的例子,可能会导致undefined behavior什么?和为什么?
#include <cstddef>
#include <iostream>
template <typename Ty>
bool in_range(const Ty *test, const Ty *r, size_t n)
{
return 0 < (test - r) && (test - r) < (std::ptrdiff_t)n;
}
void f() {
double foo[10];
double *x = &foo[0];
double bar;
std::cout << std::boolalpha << in_range(&bar, x, 10);
}
Run Code Online (Sandbox Code Playgroud)
我没有找到答案在C中指针减法何时未定义?