c结构体指针加1后,为什么地址不是加1 ?

dlnuzwh 2008-10-13 12:05:58
我定义了一个结构体,
typedef struct
{
int elem;
int number;
}stu,* Student;


int main()
{

Student student = (stu *)malloc(sizeof (stu)*2);

for(int i=0;i< 2;i++)
{

student[i].elem = i;
student[i].number =i;
}

stu * p= student;

int i= 2;

while(i)
{
printf("%d " ,p->elem);

printf(%d " ,p->number);

p++; //为什么在调试的时候地址变化是加8进行递增的,并且8刚好是sizeof(stu),为什么会这样?调试第一个地址是0x3d3f00,第二次是0x03d3f08,为什么第二次

//不是0x3d3f01,同时地址数为什么不是8个字节而是6个?
i--;
}
return 0;
}
...全文
3938 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
leiminlovesoft 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 ITGNer 的回复:]
用malloc动态分配了空间,为什么没有free释放掉?内存泄漏,不是好习惯
[/Quote]

我也认为
沉默奋发 2008-10-16
  • 打赏
  • 举报
回复
用malloc动态分配了空间,为什么没有free释放掉?内存泄漏,不是好习惯
bigbear1113 2008-10-16
  • 打赏
  • 举报
回复
看看书吧
xxgamexx 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 xxgamexx 的回复:]
引用 3 楼 yellowhwb 的回复:
增加的是sizeof(stu)的大小


仔细观察下,我觉得部分人说的不对


Student student = (stu *)malloc(sizeof (stu)*2);


分析下 LZ的语句 malloc申请的大小应该是 sizeof(stu)*2=16字节 而 student 指针无论就只有4字节 指向的地址是 16字节的首地址

感觉 LZ说的地址没说清楚 如果第一个int到第二个int应该是相差4字节 如果LZ输出的地址是第2个int到p++地址的话,就是差8…
[/Quote]

看漏了 LZ申请了2个stu大小的内存大小
muturenby 2008-10-16
  • 打赏
  • 举报
回复 3
因为你定义的指针是指向结构体的,所以指针自加一就使指针移向下一个结构体!
而你定义的结构体里只有两个整型数(共8个字节),所以该结构体指针每次移动8个字节,指向下一个结构体的首地址!

若int *p,int a[10]; p=a;
则p每次自加,就会移动2个字节(在一个整型数点2个字节的情况下),指向下一个整型数.
ningweidong 2008-10-16
  • 打赏
  • 举报
回复 1
因为stu * p= student;
p是一个student型的指针,++会向后跳一个student的大小。

你可以试一下这句话,看这个p是多少。
p = (unsigned char *)p+1;//p++;
浪流 2008-10-16
  • 打赏
  • 举报
回复
当然应该是8个字节,因为一个int 类型是4个字节,你的指针指的是student ,student 中有两个int 类型,而P又指向student 类型.
mengyikaisi 2008-10-16
  • 打赏
  • 举报
回复
指针好难啊
xxgamexx 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yellowhwb 的回复:]
增加的是sizeof(stu)的大小
[/Quote]

仔细观察下,我觉得部分人说的不对


Student student = (stu *)malloc(sizeof (stu)*2);


分析下 LZ的语句 malloc申请的大小应该是 sizeof(stu)*2=16字节 而 student 指针无论就只有4字节 指向的地址是 16字节的首地址

感觉 LZ说的地址没说清楚 如果第一个int到第二个int应该是相差4字节 如果LZ输出的地址是第2个int到p++地址的话,就是差8字节 也就是16-8


中间应该空出了8字节


leiminlovesoft 2008-10-15
  • 打赏
  • 举报
回复
补充一下:

结构体的大小是它里面成员的类型大小之和,

它与union不同们union 是所有成员拥有同块空间的大小,并且这个空间是成员占空间最大的那个成员的大小。

如果改成:
typedef struct
{
char elem;
char number;
}stu,* Student;

sizeof(struct) 大小为 2;
char 占一个字节。

改成:
typedef struct
{
double elem;
char number;
}stu,* Student;

sizeof(struct) 大小为 16;
double 为8 所以是以8为基准分配内存的

elem 占用了8个字节之后 char 它虽然只占有一个大小,但是它也被分配了8个字节。

就是这种算法的,不同的类型会影响结果。
分配内存的基准不同,所以结果也就是一样。
leiminlovesoft 2008-10-15
  • 打赏
  • 举报
回复
对一全结构体的指针加1实际是对其的结构体的总大小加1 也就是sizeof(结构体)之后的值加上1

typedef struct
{
int elem;
int number;
}stu,* Student;

在这里的 struct 的大小为8

int 占4个字节,两个就是8个字节,因此每移动一次 Student之后,移动整个结构体的大小。
rock_HX 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fetag 的回复:]
要是地址加一,那N多的语言特性都没办法实现了,都依赖着这个呢...
[/Quote]
顶..这个是思想高度上的原因
  • 打赏
  • 举报
回复
呵呵,看来解决得差不多了,加的是结构体的大小
kevin0716 2008-10-14
  • 打赏
  • 举报
回复
stu * p= student;
所以p为stu指针类型,只想一个stu结构体
sizeof(p)即等于这个结构体的大小,
因为结构体有两个int,一个占4个字节,所以是8
yang_dk 2008-10-14
  • 打赏
  • 举报
回复
加的是一个结构体的大小,指向下一个结构体
happy_Nicole 2008-10-14
  • 打赏
  • 举报
回复

ding

加的是结构体的长度阿。
chenzhp 2008-10-14
  • 打赏
  • 举报
回复
1表示的是一个单位大小,而不是实际的数字1
canican 2008-10-14
  • 打赏
  • 举报
回复
我想这就是有类型语言的特性了,结构体是一种自定义的类型
每种类型像单位一样,如公里,米,毫米,
同样 a+1(公里) 和 b+1(米)增量是不相同的了
han4587 2008-10-14
  • 打赏
  • 举报
回复
说的都不错
  • 打赏
  • 举报
回复
好好看书吧
加载更多回复(12)

70,027

社区成员

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

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