感谢您对解决我以前的问题的支持。现在我正在研究自我指涉结构。我写了以下代码:
#include <stdio.h>
int main()
{
system("clear");
struct node
{
int x;
struct node *next;
} p1;
printf(" \nthe address of node1 = %u",& p1);
printf(" \n\nthe size of node 1 = %d",sizeof( p1));
printf("\n\n the size of info part = %d",sizeof(p1.x));
printf("\n\n the size of pointer part = %ld",sizeof(p1.next));
printf("\nthe size of node is = %d\n",sizeof(struct node));
return;
}
该程序编译时几乎没有警告:
警告:格式'%u'需要类型 'unsigned int',但参数2有 输入'struct node *'
每次我用指针做某事时都会产生这样的警告。问题是什么?我不知道。谁能解释为什么它会在Linux上发生(特别是)?
我的第二个问题是当我运行程序时它显示结构16的大小而int占用4个字节(Ubuntu 10)&amp;指针是8个字节。那为什么它显示结构16字节的大小?
答案 0 :(得分:4)
在C99中,使用“%zd
”打印size_t
。
在其他地方,只需将sizeof()
的结果转换为int
;你不会溢出任何东西。
要在C99中打印指针,如果您不喜欢%p
的默认格式:
#include <inttypes.h>
printf("Pointer = 0x%" PRIXPTR "\n", (uintptr_t)&something);
类型uintptr_t
保证足够大以容纳指针。
你的尺寸问题是因为对齐要求; 8字节指针必须是8字节对齐才能获得最佳性能(在某些机器上,以避免崩溃)。因此,结构必须是8字节长的倍数,16是8的最小倍数,大于12字节。你的结构的两个部分之间也会有一些填充 - 实际上是4个字节的填充。您可以使用offsetof()
中的<stddef.h>
宏来证明这一点。
答案 1 :(得分:0)
%p
是指针的格式字符串,这是您传递给第一个printf
的内容。
答案 2 :(得分:0)
许多CPU架构无法处理或处理任意地址的效率非常低。
您的架构,我猜是x86_64,想要以至少8个字节的块访问内存。
所以,12个字节等于一个半字节的8个字节 - 不好。 接下来发生的事情是,编译器在末尾用伪数据填充结构,直到它适合偶数8个字节的块,在这种情况下为4个字节,总共16个字节。
对于不同的处理器也是如此,但具有不同的对齐方式。有些CPU甚至可以在没有对齐的情况下正常工作,但大多数现代处理器最适合对齐。
正如其他人所说,使用例如%p进行指针打印。
对于size_t
printfs,如果您不能使用C99和%lu
,请使用(unsigned long)
并转换为%zd
。
答案 3 :(得分:0)
这个程序在LINUX发行版Fedora12下工作正常。 它产生正确的输出。