首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个指针变量之间的差异

两个指针变量之间的差异
EN

Stack Overflow用户
提问于 2015-01-11 10:01:29
回答 6查看 14.5K关注 0票数 9

我是在笔试中提出这个问题的。在我的lapi上运行下面的代码时,我得到了10作为输出

代码语言:javascript
复制
#include<stdio.h>
int main()
{
  int *i, *j;/* two pointer variable*/
  i = (int *)60;
  j = (int *)20;
  printf("%d \n",i-j);
  return 0;
}

产出:

代码语言:javascript
复制
10 

有人能告诉我为什么输出是10吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-01-11 10:13:08

根据C标准(6.5.6加法操作符)

9当两个指针被减去时,都将指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素下标的差异。

所以您的程序有未定义的行为,因为指针没有指向同一个数组的元素。

似乎编译器只是生成一个对象代码,用于减去两个指针,而不管指针是否指向同一个数组的元素(它信任您)。

在这种情况下,根据指针算法,两个指针之间的区别是可以放置在两个指针之间的内存中的元素数。

在您的例子中,sizeof( int )等于4。因此,一个大小为40字节的内存可以容纳int类型的10元素,条件是sizeof( int )等于4

这个值为10,由printf函数输出。

票数 12
EN

Stack Overflow用户

发布于 2015-01-11 10:03:01

您正在计算指向int的两个指针之间的差异,即“距离”。sizeof(int)在你的平台上是4。60和20之间的差值为40,即10个ints之间的距离。您的实现似乎只是简单地评估了这种差异。

但是,C标准对两个指针之间的差异的计算施加了限制:两个指针必须指向数组中的元素,或者是结束后的一个元素。如果您能够确保ij都满足这一要求,那么差异评估是有效的。因为您的代码不一定满足这个条件,所以它可能有未定义的行为,在这种情况下,输出/结果可能是任何东西。

还请注意,这是对非引用ij的未定义行为,除非它们指向包含int值的有效地址。

票数 8
EN

Stack Overflow用户

发布于 2015-01-11 10:14:13

只有当两个指针指向同一个(数组)对象(或后面的一个指针)时,C标准才定义两个指针的差异,因此OP的代码调用未定义的行为。结果可能是任何事情。

来自C11标准:

6.5.6/9加法算子 当两个指针被减去时,两个指针都将指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素下标的差异。结果的大小是实现定义的,其类型(有符号整数类型)是在ptrdiff_t头中定义的。如果结果在该类型的对象中无法表示,则行为是未定义的。

下列代码是有效的:

代码语言:javascript
复制
#include <stdio.h>

int main()
{
  int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  int * i = a + 0;
  int * j = a + 10; /* Points "one past the last element" of the array. */

  printf("%td \n", i - j);

  return 0;
}

它还打印10

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27885823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档