请教高手:关于字节对齐

lxw521liu 2009-11-11 11:46:14
我想看一下结构体内数据是如何对齐和填充的,打印出来的数据有点不明白,望指教!我用的VC6.0


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct
{
unsigned long m_empty;
unsigned long m_id;
unsigned char m_value[16];
}test;

int main()
{
test *p1;
test *p2;
int rc;
int i;

p1 = (test*)malloc(sizeof(test));
p2 = (test*)malloc(sizeof(test));

p1->m_empty = p2->m_empty = 1;
p2->m_id = p2->m_id = 100;

for(i =0;i<16;i++)
{
p1->m_value[i] = p2->m_value[i] = 0;
}

printf("size:%d\n\n",sizeof(test));

printf("m_empty:%d %d\n",p1->m_empty,p2->m_empty);
printf("m_id:%d %d\n\n",p1->m_id,p2->m_id);

for(i = 0;i < sizeof(test); i++)
{
printf("%d %d\n",*((unsigned char*)p1+i),*((unsigned char*)p2+1));
}

rc = strncmp((unsigned char*)p1, (unsigned char*)p2, sizeof(test));

printf("rc = %d\n", rc);

free(p1);
free(p2);

return 0;
}


输出:
size:24

m_empty:1 1
m_id:-842150451 100 //why?

1 0 //why?
0 0
0 0
0 0
205 0 //why?
205 0 //why?
205 0 //why?
205 0 //why?
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
rc = 0 // 用字符串比较函数,rc=0 是否可说明内存数据是一样的
Press any key to continue
...全文
117 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
walkersfaint 2009-11-12
  • 打赏
  • 举报
回复
初始化
logiciel 2009-11-12
  • 打赏
  • 举报
回复
同意3、4楼,这些问题导致p1指向的结构中有些单元没有被赋值,因此输出中有随机值-842150451、1、205等。

strcmp是按照字节(byte-wise)比较的,并且比较的过程中会检查是否出现了"\0"结束符,一旦任意一个字符串指针前进过程中遇到结束符,将终止比较。而memcmp函数是用于比较两个内存块的内容是否相等,在用于字符串比较时通常用于测试字符串是否相等,不常进行byte-wise的字符串比较。如果要比较的对象中包含一些由于边界对齐需求而填入结构对象中的空格、联合(union)结束的额外空格、字符串所分配的空间未使用完的部分引起的“holes”的话,最好使用memcmp来完成。这些“holes”的内容是不确定的,在执行byte-wise比较时结果也是不明确的。
nielin3000 2009-11-12
  • 打赏
  • 举报
回复
代码有问题吗我看没什么问题
farawayspring 2009-11-12
  • 打赏
  • 举报
回复
for(i = 0;i < sizeof(test); i++)
{
printf("%d %d\n",*((unsigned char*)p1+i),*((unsigned char*)p2+1));//这儿是不是应该改为p2+i
}
farawayspring 2009-11-12
  • 打赏
  • 举报
回复
int main()
{
test *p1;
test *p2;
int rc;
int i;

p1 = (test*)malloc(sizeof(test));
p2 = (test*)malloc(sizeof(test));

p1->m_empty = p2->m_empty = 1;
p2->m_id = p2->m_id = 100;//这儿好像写错了,应改为 p1->m_id = p2->m_id = 100;
//
DISINHUI 2009-11-12
  • 打赏
  • 举报
回复
1楼说的不完全对,strncmp函数的返回值,是比较到第三个参数时候的两个字符串种在该位置处的字符的ASCII码的差值。当然前面比较的字符都是相同的。
1。如果返回值非零,表示在第三个参数的字符之前已经有不同的字符了(当然包括第三个参数位置上的字符不同)。
2。如果返回零,表示至少在第三个参数以及之前,所有的字符都相同。但不表示两个字符串完全相同。除非两个字符串长度一样,第三个参数恰好是该长度值。

69,382

社区成员

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

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