1

所以我在 C 中有一个程序。它正在运行,但我不明白输出是如何生成的??

这是程序:

#include <stdio.h>
int c;
void main() {
    int a=10,b=20,j;
    c=30;
    int *p[3];
    p[0]=&a;
    p[1]=&b;
    p[2]=&c;
    j=p[0]-p[2];
    printf("\nValue of p[0] = %u\nValue of p[2] = %u\nValue of j = %d\n\n",p[0],p[2],j);
}

这是输出:

Value of p[0] = 3213675396
Value of p[2] = 134520860
Value of j = -303953190

谁能告诉我 j 是如何得到这个值的,即 -303953190?它应该是3079154536

4

5 回答 5

1

p是指向 int 的指针数组 - 所以它存储指向 int 而不是 int 的指针。因此,p[0]andp[2]是指针——减去它们会给你一个整数,它可能会溢出,你试图将它存储在int问题所在的地方。地址也将使用%pnot打印%d

取消引用该值,您将获得所需的内容,如下所示:

j=p[0][0]-p[2][0];

或像这样:

j=*(p[0])-*(p[2]);
于 2013-11-11T12:58:00.877 回答
1

您应该计算指向对象而不是指针的差异:

 j=(*(p[0]))-(*(p[2]));
于 2013-11-11T12:58:26.077 回答
1

减去两个指针会得到一个有符号整数。

C 标准第 6.56 章

6.5.6 加法运算符

[...]

9 当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。结果的大小是实现定义的,其类型(有符号整数类型)是在<stddef.h>头文件中定义的ptrdiff_t 。

并将指针差异分配给 a 会int溢出int.

为了解决这个溢出而不是

int j;

利用

ptrdiff_t j;

然后使用打印值%td

C 标准第 7.17 章

7.17 常用定义<stddef.h>

[...]

2 类型为
ptrdiff_t
,即两个指针相减结果的有符号整数类型;


也(无关)

void main()

是错的。应该是

int main(void)

所以正确的代码应该是这样的:

#include <stdio.h>
#include <stddef.h> /* for ptrdiff_t */

int c;

int main(void) 
{
  int a=10, b=20;
  ptrdiff_t j;
  int * p[3];

  c=30;

  p[0]=&a;
  p[1]=&b;
  p[2]=&c;

  j=p[0]-p[2];

  printf("\nValue of p[0] = %p\nValue of p[2] = %p\nValue of j = %td\n\n",
    (void *) p[0],
    (void *) p[2],
    j);

  return 0;
}
于 2013-11-11T13:04:27.450 回答
1

您正在执行 3213675396 - 134520860。如果您想获得该值,请使用 *p[0]。如果您的意图是减去地址(这没有意义但仍然),则预期的答案应该是 3079154536。但是由于数字太大而无法容纳,因此您会得到答案 -303953190。考虑 char 在数字行上的简单性

-128 -127 -126 -125 ... 0 1 2 ... 125 126 127

现在,如果您尝试将 128 存储在范围之外,那么它将给出值 -128。如果尝试分配值 130,您将得到 -126。因此,当超出右侧限制时,您可以看到从左侧开始计数。这只是为了解释的目的,只有这种行为的真正原因是由于它被存储为二的恭维这一事实。更多信息可以在这里找到

于 2013-11-11T13:06:14.427 回答
0

您将其打印为整数而不是无符号数。使用%u而不是%d.

尝试这个:

#include <stdio.h>
int c;
void main() {
    int a=10,b=20;
    unsigned j;
    c=30;
    int *p[3];
    p[0]=&a;
    p[1]=&b;
    p[2]=&c;
    j=(unsigned)p[0]-(unsigned)p[2];
    printf("\nValue of p[0] = %u\nValue of p[2] = %u\nValue of j = %u\n\n",(unsigned)p[0],(unsigned)p[2],j);
}
于 2013-11-11T13:50:43.093 回答