Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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_Pointers_Output_Structure - Fatal编程技术网

C 指向结构变量的指针的大小是多少?

C 指向结构变量的指针的大小是多少?,c,pointers,output,structure,C,Pointers,Output,Structure,我试图打印两种情况下指针的大小。对于这两种情况,我都得到816作为输出 #include <stdio.h> struct Book { char name[10]; int price; }; int main(void) { struct Book a; // Single structure variable struct Book* ptr; // Pointer of Structure type ptr = &a

我试图打印两种情况下指针的大小。对于这两种情况,我都得到
816
作为输出

#include <stdio.h>

struct Book
{
    char name[10];
    int price;
};

int main(void)
{
    struct Book a;      // Single structure variable
    struct Book* ptr;   // Pointer of Structure type

    ptr = &a;

    struct Book b[10];  // Array of structure variables
    struct Book* p;     // Pointer of Structure type

    p = &b;

    printf("%ld %ld\n",sizeof(ptr),sizeof(*ptr));
    printf("%ld %ld\n",sizeof(p),sizeof(*p));

    return 0;
}
#包括
结构书
{
字符名[10];
国际价格;
};
内部主(空)
{
struct Book a;//单个结构变量
struct Book*ptr;//结构类型的指针
ptr=&a;
结构书b[10];//结构变量数组
struct Book*p;//结构类型的指针
p=&b;
printf(“%ld%ld\n”、sizeof(ptr)、sizeof(*ptr));
printf(“%ld%ld\n”,sizeof(p),sizeof(*p));
返回0;
}

首先,
sizeof
运算符生成类型
size\t
,必须使用
%zu
打印该类型


然后,通常在任何体系结构中,指针的大小总是恒定的,而与指针指向的类型无关。换句话说,指针需要保存内存位置,对于任何正常的体系结构,地址(内存位置)都有固定的大小。因此,任何指针的大小都是相同的。

在第二种情况下,这就是您想要的:

printf("%zu %zu\n", sizeof(p1), sizeof(*p1));
// Output
8 160
好的!让我们从头开始

正如苏拉夫·戈什(Sourav Ghosh)在他的回答中所说,“一个
指针
需要保存一个内存位置,对于任何正常的体系结构来说,(内存位置的)地址都有一个固定的大小。因此,任何指针的大小都是相同的”,不管它指向的数据类型如何

现在进入您的问题,考虑并尝试理解您的程序的修改版本:

#include <stdio.h>

struct Book
{
    char name[10];
    int price;
};

int main(void)
{
    struct Book b[10];  // Array of structure variables
    struct Book* p;     // Pointer to type struct Book
    struct Book (*p1)[10]; // Pointer to type struct Book[], which is array of type struct Book

    p = b; // same as p = &b[0] but not as p = &b
    p1 = &b; // this is how assignment of a pointer to array is done

    printf("%zu %zu\n", sizeof(struct Book*), sizeof(struct Book));
    printf("%zu %zu\n",sizeof(p),sizeof(*p));
    printf("%zu %zu\n",sizeof(p1),sizeof(*p1));

    return 0;
}
您可以在输出中看到,sizeof(structbook)、sizeof(p)和sizeof(p1)都是相同的。因此,任何类型指针的大小都是相同的

但是当您打印
结构书的大小时,即您询问编译器,“告诉我此结构书包含多少字节的内存”

对于前两种情况
(sizeof(struct Book)或sizeof(*p))
,它是16,对于最后一种情况,它是160,大小为10个
struct Book
类型的变量

如果你想知道为什么
16
作为
stuct Book
类型变量的大小,那是因为
char
int
成员之间有
2个填充字节


阅读此文。

指针大小总是相同的,函数指针除外,它可能更大,对吗?@FiddlingBits嗯,没有标准,但是的,这是实际的事情。添加了一行以澄清。@FiddlingBits什么是
,函数指针除外
?我到处都读到过
sizeof(pointers)
在任何机器上都是一样的,不管它指向什么数据类型。即使在阅读了您的评论之后,我检查了它,发现(在我的系统上)指向int的函数指针的大小和指向int的指针的大小是相同的。@FiddlingBits指针大小总是相同的。。。不。@Lucas:关于C,唯一的要求是
char*
void*
具有相同的大小和对齐方式,指向合格类型的指针具有与其非合格等价物指针相同的大小和对齐方式,指向
struct
类型的所有指针具有相同的大小和对齐方式,指向所有
union
类型的指针具有相同的大小和对齐方式。虽然不同的指针类型在x86这样的硬件上可能具有相同的大小,但这并不能保证,也不应该依赖于它。Ajay,你想让这些分隔线在文章末尾表示什么?请消除这种干扰。特别是如果你插入它们只是为了绕过系统,告诉oyur你的问题中有太多的代码,而没有伴随散文式的解释。除了所有的嗡嗡声,你的代码中还有一个不兼容的赋值操作,即
p=&b。您正在将结构变量的
数组的地址分配给指向结构变量的
指针。只要做
p=b
// perhaps on your PC
8 16
8 16
8 160
// on my PC
4 16
4 16
4 160