c结构问题

时间:2010-10-07 06:59:22

标签: c struct

感谢您对解决我以前的问题的支持。现在我正在研究自我指涉结构。我写了以下代码:

#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字节的大小?

4 个答案:

答案 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下工作正常。 它产生正确的输出。