Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符指针算法C_C_Char_Pointer Arithmetic - Fatal编程技术网

字符指针算法C

字符指针算法C,c,char,pointer-arithmetic,C,Char,Pointer Arithmetic,我正在学习指针算术,我遇到了这样的事情: char *str1, *str2; /* stuff in between */ int f = str2 - str1; 什么是str2-str1返回的?比如说str1=“foo”和str2=“foobar”f=str2中的内存地址-str1中的内存地址。 “foo”和“foobar”是指针指向的这些内存位置的值 例如: 如果str2=0x800000A 和str1=0x8000000 str2 - str1 = 0x8000000a - 0x

我正在学习指针算术,我遇到了这样的事情:

char *str1, *str2;

/* stuff in between */

int f = str2 - str1;

什么是str2-str1返回的?比如说
str1=“foo”
str2=“foobar”
f
=str2中的内存地址-str1中的内存地址。
“foo”
“foobar”
是指针指向的这些内存位置的值

例如:

如果str2=0x800000A

str1=0x8000000

str2 - str1 = 0x8000000a - 0x80000000 
str2 - str1 = 0x0a 

已编辑

这个问题的答案取决于具体情况

1) 在您的情况下,由于指针没有指向任何东西,因此结果将是垃圾


2) 如果两个指针指向程序空间中的两个有效内存位置,则结果将是这两个位置之间的内存字节数。尽管这没有任何意义,而且根据C规范,如果两个指针不指向同一个数组或字符串,这是UB。如果两个指针指向同一数组或字符串,则结果将是同一数组中两个元素之间的元素数(当指针指向该数组中的这两个元素时)。检查SO问题以获得示例和更多解释。

您提出问题的结果没有定义。要使指针差分正确工作,它们必须来自相同的数组序列(动态、自动,甚至自动VLA都没有区别)。或超过最后一个元素的一个过去地址:

§6.5.6加法运算符(第9页)

减去两个指针时,两个指针都应指向同一数组对象的元素,或指向数组对象最后一个元素的一个指针;结果是两个数组元素的下标不同。结果的大小由实现定义,其类型(有符号整数类型)为
标题中定义的
ptrdiff\u t
。如果结果不能在该类型的对象中表示,则行为是未定义的。换句话说,如果表达式
P
Q
分别指向数组对象的
i-th
j-th
元素,则表达式
(P)-(Q)
的值为i−j如果值适合类型为
ptrdiff\u t.
的对象,则如果表达式
P
指向数组对象的元素或数组对象最后一个元素的过去一个元素,并且表达式
Q
指向同一数组对象的最后一个元素,则表达式
((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;
}

原因从标准的引用部分解释。

我想说,只有当两个指针指向同一个“对象”时,这才有效。不一定,例如:
char*str2=&a
char*str1=&b
那么地址在堆栈上,我上面的答案将具有不同的非连续内存位置。请参阅WhozCraig的答案:(什么是
a
b
,顺便问一下?
a
b
是局部变量。“地址在堆栈上,我上面的答案将有不同的非连续内存位置。”不是由C指定的。甚至“堆栈”也不是由C指定的。结果取决于平台/编译器,因为它是未定义的行为。我想说2)只有当两个指针指向同一个“对象”时才有效结果将是这两个位置之间的内存字节数”是一个常见结果,但未由C规范定义-它是UB。其他结果可能包括程序故障或
f
中的无意义值。
7