初学者求教,为什么指针有时候占用的是4个字节,有时候占用的又是6个字节

rex_J 2014-06-30 08:03:03
#include <stdio.h>

typedef struct qnode
{
char data[50];
struct qnode * next;
}QNode;

typedef struct
{
QNode * front;
QNode * rear;
}LiQueue;

int main(void)
{
printf("%d\n",sizeof(QNode));
printf("%d\n",sizeof(LiQueue));
return 0;
}
第一个为什么是56?
第二个为什么是8?
...全文
753 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
707wk 2014-07-01
  • 打赏
  • 举报
回复
引用 12 楼 bhfdcn 的回复:
[quote=引用 11 楼 zxh707wk 的回复:] [quote=引用 10 楼 bhfdcn 的回复:] [quote=引用 9 楼 zxh707wk 的回复:] 又来了。。。 我用64位gcc编译结果为
64
16


------------------
(program exited with code: 0)
Press return to continue


64位环境下,普通指针大小为8,非静态成员函数指针大小为16[/quote]但64咋来的。。。[/quote] 56+8啊,8字节对齐[/quote]忘了把4换成8了。。。
bhfdcn 2014-06-30
  • 打赏
  • 举报
回复
引用 11 楼 zxh707wk 的回复:
[quote=引用 10 楼 bhfdcn 的回复:] [quote=引用 9 楼 zxh707wk 的回复:] 又来了。。。 我用64位gcc编译结果为
64
16


------------------
(program exited with code: 0)
Press return to continue


64位环境下,普通指针大小为8,非静态成员函数指针大小为16[/quote]但64咋来的。。。[/quote] 56+8啊,8字节对齐
707wk 2014-06-30
  • 打赏
  • 举报
回复
引用 10 楼 bhfdcn 的回复:
[quote=引用 9 楼 zxh707wk 的回复:] 又来了。。。 我用64位gcc编译结果为
64
16


------------------
(program exited with code: 0)
Press return to continue


64位环境下,普通指针大小为8,非静态成员函数指针大小为16[/quote]但64咋来的。。。
bhfdcn 2014-06-30
  • 打赏
  • 举报
回复
引用 9 楼 zxh707wk 的回复:
又来了。。。 我用64位gcc编译结果为
64
16


------------------
(program exited with code: 0)
Press return to continue


64位环境下,普通指针大小为8,非静态成员函数指针大小为16
707wk 2014-06-30
  • 打赏
  • 举报
回复
又来了。。。 我用64位gcc编译结果为
64
16


------------------
(program exited with code: 0)
Press return to continue


rex_J 2014-06-30
  • 打赏
  • 举报
回复
引用 7 楼 bhfdcn 的回复:
[quote=引用 6 楼 u012461368 的回复:] [quote=引用 5 楼 bhfdcn 的回复:] [quote=引用 3 楼 u012461368 的回复:] [quote=引用 1 楼 bhfdcn 的回复:] 第一个是因为内存对齐的原因,你的32位机器指针大小是4,第二个是因为两个指针
内存对齐?就是也有可能不是6吗?[/quote] 举个简单的例子吧,比如你的代码改成如下:

typedef struct qnode
{
    char data;
    struct qnode * next;
}QNode;
然后你在输出sizeof(QNode),大小为8,因为data之后补齐了3个字节,实际指针还是4个字节,内存布局如下图所示: [/quote] 哦哦,是指结构体运用指针后大小始终保持4的倍数的意思吗?[/quote] 不完全正确,你把指针换成int类型或别的大于1字节的类型也可能引起结构体大小变化,比如:
typedef struct qnode
{
    char data;
    int next;
}QNode;
大小也为8,再比如:
typedef struct qnode
{
    char data1;
    char data2;
    int next;
}QNode;
的大小也为8,但是你要把data2和next位置换一下,大小就变成12了,如下:
typedef struct qnode
{
    char data1;
    int next;
    char data2;
}QNode;
大小为12。 [/quote] 懂了,thanks
bhfdcn 2014-06-30
  • 打赏
  • 举报
回复
引用 6 楼 u012461368 的回复:
[quote=引用 5 楼 bhfdcn 的回复:] [quote=引用 3 楼 u012461368 的回复:] [quote=引用 1 楼 bhfdcn 的回复:] 第一个是因为内存对齐的原因,你的32位机器指针大小是4,第二个是因为两个指针
内存对齐?就是也有可能不是6吗?[/quote] 举个简单的例子吧,比如你的代码改成如下:

typedef struct qnode
{
    char data;
    struct qnode * next;
}QNode;
然后你在输出sizeof(QNode),大小为8,因为data之后补齐了3个字节,实际指针还是4个字节,内存布局如下图所示: [/quote] 哦哦,是指结构体运用指针后大小始终保持4的倍数的意思吗?[/quote] 不完全正确,你把指针换成int类型或别的大于1字节的类型也可能引起结构体大小变化,比如:
typedef struct qnode
{
    char data;
    int next;
}QNode;
大小也为8,再比如:
typedef struct qnode
{
    char data1;
    char data2;
    int next;
}QNode;
的大小也为8,但是你要把data2和next位置换一下,大小就变成12了,如下:
typedef struct qnode
{
    char data1;
    int next;
    char data2;
}QNode;
大小为12。
rex_J 2014-06-30
  • 打赏
  • 举报
回复
引用 5 楼 bhfdcn 的回复:
[quote=引用 3 楼 u012461368 的回复:] [quote=引用 1 楼 bhfdcn 的回复:] 第一个是因为内存对齐的原因,你的32位机器指针大小是4,第二个是因为两个指针
内存对齐?就是也有可能不是6吗?[/quote] 举个简单的例子吧,比如你的代码改成如下:

typedef struct qnode
{
    char data;
    struct qnode * next;
}QNode;
然后你在输出sizeof(QNode),大小为8,因为data之后补齐了3个字节,实际指针还是4个字节,内存布局如下图所示: [/quote] 哦哦,是指结构体运用指针后大小始终保持4的倍数的意思吗?
bhfdcn 2014-06-30
  • 打赏
  • 举报
回复
引用 3 楼 u012461368 的回复:
[quote=引用 1 楼 bhfdcn 的回复:]
第一个是因为内存对齐的原因,你的32位机器指针大小是4,第二个是因为两个指针

内存对齐?就是也有可能不是6吗?[/quote]
举个简单的例子吧,比如你的代码改成如下:

typedef struct qnode
{
char data;
struct qnode * next;
}QNode;

然后你在输出sizeof(QNode),大小为8,因为data之后补齐了3个字节,实际指针还是4个字节,内存布局如下图所示:
rex_J 2014-06-30
  • 打赏
  • 举报
回复
引用 2 楼 ypzhong 的回复:
结构体字节对齐,楼主加个这个再测测看。
#pragma pack(1)
typedef struct qnode
{
char data[50];
struct qnode * next;
}QNode;

typedef struct
{
QNode * front;
QNode * rear;
}LiQueue;

#pragma pack()
第一个变成54了,这是什么原因?能解释一下吗?
rex_J 2014-06-30
  • 打赏
  • 举报
回复
引用 1 楼 bhfdcn 的回复:
第一个是因为内存对齐的原因,你的32位机器指针大小是4,第二个是因为两个指针
内存对齐?就是也有可能不是6吗?
ypzhong 2014-06-30
  • 打赏
  • 举报
回复
结构体字节对齐,楼主加个这个再测测看。
#pragma pack(1)
typedef struct qnode
{
char data[50];
struct qnode * next;
}QNode;

typedef struct
{
QNode * front;
QNode * rear;
}LiQueue;

#pragma pack()
bhfdcn 2014-06-30
  • 打赏
  • 举报
回复
第一个是因为内存对齐的原因,你的32位机器指针大小是4,第二个是因为两个指针

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧