我正在学习指针算术,我遇到过这样的事情:
char *str1, *str2;
/* stuff in between */
int f = str2 - str1;
str2 - str1
返回什么?让我们说str1 = "foo"
和str2 = "foobar"
。
答案 0 :(得分:12)
您提出问题的结果未定义。要使指针差异正常工作,它们必须来自相同的数组序列(动态,自动,甚至自动VLA没有区别)。或过去最后一个元素的过去地址:
§6.5.6加法运算符(p9)
当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素;结果是两个数组元素的下标的差异。结果的大小是实现定义的,其类型(有符号整数类型)在
ptrdiff_t
标头中定义为<stddef.h>
。如果结果在该类型的对象中无法表示,则行为未定义。换句话说,如果表达式P
和Q
分别指向数组对象的i-th
和j-th
元素,则表达式(P)-(Q)
具有值i-j如果值适合类型为ptrdiff_t.
的对象,此外,如果表达式P
指向数组对象的元素或者指向数组对象的最后一个元素,并且expressionQ
指向同一个数组对象的最后一个元素,表达式((Q)+1)-(P)
具有与((Q)-(P))+1
和-((P)-((Q)+1))
相同的值,如果表达式的值为零P
指向数组对象的最后一个元素之后的一个,即使表达式(Q)+1
未指向数组对象的元素。 106
那就是说,如果你改写以符合上述规则,那就像:
#include <stdio.h>
int main()
{
const char *p = "Hello World";
const char *q = p+7;
printf("%td\n", q-p);
return 0;
}
<强>输出强>
7
并且从标准的引用部分解释了原因。
答案 1 :(得分:2)
<强>被修改强>
这个问题的答案取决于具体情况。
1)在你的情况下,由于指针没有指向任何东西,结果将是垃圾
2)如果两个指针指向程序空间中的两个有效内存位置,那么结果将是这两个位置之间的内存字节数。虽然这没有任何意义,并且根据C规范它是UB,如果两个指针没有指向相同的数组或字符串。如果两个指针指向同一个数组或字符串,则结果将是同一数组中两个元素之间的元素数(当指针指向该数组内的那两个元素时)。检查this SO问题以获取示例和更多解释。
答案 2 :(得分:0)
id
= f
中的内存地址 - str2
中的内存地址。
str1
和"foo"
是这些指针所指向的内存位置的值。
示例:
如果"foobar"
和str2 = 0x8000000a
str1 = 0x80000000