【问题标题】:Determine data type sizes using pointer in C使用 C 中的指针确定数据类型大小
【发布时间】:2018-07-19 17:29:21
【问题描述】:
#include <stdio.h>

int main()
{
    int a, b, c, d;

    char *p = (char *)0;
    int *q = (int *)0;
    float *r = (float *)0;
    double *s = 0;

    a = (int) (p+1);
    b = (int) (q+1);
    c = (int) (r+1);
    d = (int) (s+1);

    printf("%d %d %d %d", a, b, c, d);

    return 0;
}

当我运行它时,它会给出输出

1 4 4 8

从输出中我假设它给出了数据类型(char、int、float 和 double)的大小作为输出。但我不明白怎么做。有人可以解释一下这个程序。 (char *)0 是什么意思? (int)(p+1) 是做什么的?

提前致谢。

【问题讨论】:

  • 即使它正在“工作”,它的行为也没有被 C 标准定义。无论如何,您可能想阅读指针算法。
  • 获取C书。无法复制和粘贴
  • “但我不明白怎么做。” - 由于行为未定义,无意义的操作会在您的计算机和编译器上产生所谓的有意义的结果。

标签: c pointers


【解决方案1】:

(char *)0 是什么意思?

它将0 转换为一个指针。但这不是必需的。你可以使用

    char *p = 0;

    char *p = NULL;

(int)(p+1) 是做什么的?

p+1 计算为指针值。 (int) 部分将指针转换为int。它适用于某些平台,因为pp+1 之间的数值差异是sizeof(*p)

但是,请注意这是未定义的行为。不要在生产代码中使用它。使用标准支持的机制来获取类型的大小 -- sizeof(type)

int a = sizeof(char);
int b = sizeof(int);
int c = sizeof(float);
int d = sizeof(double);

printf("%d %d %d %d", a, b, c, d);

您可以通过将size_t 用于变量来保留sizeof 评估的类型。

size_t a = sizeof(char);
size_t b = sizeof(int);
size_t c = sizeof(float);
size_t d = sizeof(double);

printf("%zu %zu %zu %zu", a, b, c, d);

【讨论】:

  • ... 甚至更好 size_t + %zu
  • 但是为什么这是未定义的行为?它可以给出什么样的错误答案?
  • 标准不允许你评估NULL + 1
【解决方案2】:

在 C 中,指针和整数是可以互换的。所以:

(char *)0 告诉编译器查看int 0,就好像它是指向char 的指针的地址一样。然后它将其分配给p,一个指向char 的指针。

C 允许指针运算,因此表达式p+1 计算编译器将在p 之后放置另一个char 的地址。 pp+1 的地址之间的差异应该是 1 char 的大小(以字节为单位)。

为了确保 C 在打印时将其识别为 int,赋值 a = (int) (p+1);p+1(地址)转换为 int。实际上,这就是char 的大小。

【讨论】:

    【解决方案3】:

    让我们分析每个部分:

    char *p = (char *)0;
    

    创建图表指针并将其初始化为 0。(char *) 用于将 0 转换为字符地址。所以指针p指向地址0。

    a = (int) (p+1);
    

    (p+1)char*(p 的当前类型)的当前地址 (0) 之后的下一个地址。 (int) 再次出现在演员阵容中。对于每种类型,它都会给出大小,因为它的值是第一个地址和第二个地址之间的距离。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2014-11-06
      • 1970-01-01
      • 2020-04-07
      相关资源
      最近更新 更多