字符串数组的比较及联合体字节对齐问题

shunzi__1984 2008-10-18 12:03:50
1.union
{
int i;
char j[10];
float k;
}u;
为什么是sizeof(u)=12呢?怎么个对齐法?和struct有什么不一样吗?

2.int pstrcmp(const void *p1, const void *p2)
{
return strcmp(*(char * const *)p1, *(char * const *)p2);
}
高手能解释一下这个字符串数组的比较函数吗?(尤其是那转化的问题)
...全文
269 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssepotato 2011-06-09
  • 打赏
  • 举报
回复
偶然看到这个贴,发表一下意见。
typedef union A
{
double a;
char c[10];
}_A;

int main()
{
printf("%d\n", sizeof(_A));
return 0;
}
这里输出结果为16,所以感觉对齐规则应该是地址可以整除联合中的最宽元素。即10扩充到16(double占8字节),而不是被扩充到12。
dxj1234 2008-12-30
  • 打赏
  • 举报
回复
偶然看到这个贴,发表一下意见。
似乎pstrcmp是用来比较字符串二级指针的,可能直觉上容易使人误会。p前缀一般的意思不就是表示是指针吗。
这样用:
char* s1 = "abc";
char* s2 = "def";
void* p1 = (void*)&s1; // 当然这两个指针可能是从其他某个函数里面得来的,
void* p2 = (void*)&s2; // 没人会专门绕弯子:)
pstrcmp(p1, p2);

如果使用strcmp就可以直接:strcmp(s1, s2);
冻结 2008-10-18
  • 打赏
  • 举报
回复
另外,它还有默认转换由void * 到 char*!
冻结 2008-10-18
  • 打赏
  • 举报
回复

2.int pstrcmp(const void *p1, const void *p2)
{
return strcmp(*(char * const *)p1, *(char * const *)p2);
//(char * const *)p1 p1应该是指向char× 的常量指针,说明此指针指向的char× 的内容不可变。
//*(char * const *)p1 应该是char× 的值。

}
高手能解释一下这个字符串数组的比较函数吗?(尤其是那转化的问题)
帅得不敢出门 2008-10-18
  • 打赏
  • 举报
回复
第一个是数据对齐
第二个

int pstrcmp(const void *p1, const void *p2)
{
return strcmp(*(char * const*)p1, *(char * const*)p2);
}

int main()
{
char stra[] = "abc";
char strb[] = "bcdefg";
cout << strcmp(stra,strb);
//cout << pstrcmp(stra,strb); 这句注释去掉 会异常退出 SO 你所说的这个字符串数组的比较函数 是不行的
return 0;
}
CrazyBm 2008-10-18
  • 打赏
  • 举报
回复
问题1. 和你编译器设置的结构对齐有关,你应该使用的是默认的4个字节对齐.
VC中结构体数据成员的对齐问题
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的
对齐方式调整位置,空缺的字节VC会自动填充.同时VC为了确保结构的大小为结构
的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在
为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字.
struct MyStruct { double dda1; char dda; int type };
为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一
个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为
sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节.接下来为第二
个成员dda分配空间,下一个可以分配的地址对于结构的起始地址的偏移量为8,是
sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变
量占用sizeof(char)=1个字节.接下来为第三个成员type分配空间,这时下一个可
以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了
满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东
西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof
(int)=4的倍数,所以把type存放在偏移量为12的地方,该变量占用sizeof(int)=4
个字节.这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:
8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字
节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充.所以整个结构的大
小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何
有意义的东西.
静态数据成员是存放在静态区共有的,不算在结构体中.
没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存
中都有唯一的地址。
sizeof(func("1234"))=4//func的返回类型为int,所以相当于//求sizeof(int)

问题2. 在我看来,不如直接写return strcmp((char*)p1, (char*)p2);
npuhuxl 2008-10-18
  • 打赏
  • 举报
回复
union
{
int i;
char j[10];
float k;
}u;
最大的是10,但是一般以4字节对齐,即sizeof(u)应该是4的整数倍,所以是12

第二个问题你可以搜一下const的使用规则就知道了

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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