相关疑难解决方法(0)

指针减法混淆

当我们从另一个指针中减去一个指针时,差异不等于它们相隔多少个字节但等于有多少个整数(如果指向整数)它们是分开的.为什么这样?

c

48
推荐指数
5
解决办法
6万
查看次数

C语言中的指针算法

请考虑以下代码片段:

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 pointers pointer-arithmetic

12
推荐指数
1
解决办法
8804
查看次数

使用memcmp比较两个不相关的指针是UB吗?

对两个不相关的指针(即不指向同一数组或对象的两个指针)执行算术比较是 C 中未定义的行为。

\n
int a, b;\nbool ub = &a < &b;\n
Run Code Online (Sandbox Code Playgroud)\n

然而,人们可以将它们投射到uintptr_t

\n
int a, b;\nbool not_ub = (uintptr_t)&a < (uintptr_t)&b;\n
Run Code Online (Sandbox Code Playgroud)\n

演员表已定义,比较也已定义。

\n

但是,使用 比较两个指针是否是UB memcmp

\n
int a, b;\nint* pa = &a;\nint* pb = &b;\nint maybe_ub = memcmp(&pa, &pb, sizeof(int*));\n
Run Code Online (Sandbox Code Playgroud)\n

C11 \xc2\xa77.24.4.1 说:

\n
\n

memcmp 函数将 s1 指向的对象的前 n 个字符与 s2 指向的对象的前 n 个字符进行比较。

\n
\n

我对该摘录的理解是比较的是指针的表示,而不是指针本身。因此,我希望调用不会memcmp表现出任何未定义的行为。

\n

由于标准没有指定对象如何存储或表示(特定情况除外,但不是这里),我对结果不感兴趣memcmp不感兴趣,而只是关心它是否是 UB。

\n

c undefined-behavior language-lawyer

5
推荐指数
1
解决办法
195
查看次数

是否减去指向同一数组的不同元素的指针在C中是否有效?

是否减去指向同一数组的不同元素的指针在C中是否有效?

下面的东西是否保证按照C标准工作?我依稀记得读到这是无效的吗?

int * a;
int * b;
a = (int*) 100;
b = (int*) 200;
printf("%d\n", b-a);
Run Code Online (Sandbox Code Playgroud)

这会给我25.

c pointers

3
推荐指数
1
解决办法
482
查看次数

为什么指针减法是C++中未定义的行为?

对于下面的例子,可能会导致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中指针减法何时未定义?

c++ pointers

3
推荐指数
2
解决办法
382
查看次数