c - 在 C 中使用指针确定数据类型大小

标签 c pointers

#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) 有何作用?

提前致谢。

最佳答案

What does (char *)0 means?

它将 0 转换为指针。但这没有必要。你本来可以使用

    char *p = 0;

    char *p = NULL;

What does (int)(p+1) do?

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);

关于c - 在 C 中使用指针确定数据类型大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51428702/

相关文章:

objective-c - IOS 进程内部 - 如何获取信息?

c - 将值设置为数组(初始化后)

c - OpenCV中两点之间的距离

C++ 创建一个每个节点超过 2 个字段的链表

c++ - "void *(*)(void *)"在 C++ 中是什么意思?

c++ - C++ 是否对 POD typedef 进行值初始化?

c - 为什么这个C程序的输出是这样的?

c - 即使在代码的前面声明了变量,也会出现“未声明的标识符”错误

c++ - 通过创建局部变量减少堆栈指针

c - 如何为结构、结构内的结构数组正确分配内存,并将该数组作为参数传递