最近碰见C语言的几个小问题。
1.关于结构体的大小(sizeof)。
- /*struct assign
- {
- char a;
- int b;
- char c;
- };
- */
- struct assign
- {
- char a;
- char b;
- int c;
- };
- int i = offsetof(struct assign,b);
- printf("%d/n",sizeof(struct assign));
- printf("%d/n",i);
分别声明以上两种结构体,分析结构体的长度。
第一种应该为12,第二种应该为8.这个主要是内存对齐问题。32位机,为了提高速度,是不会把一个int型的放在2个32位的空间里面的。 因为当读取的时候会读取两次,系统不允许这样做的。也可以用offsetof求其中的一个结构体中的变量相对与结构体首部的位置。
(offsetof是一个宏,上次写可变长的函数时候就说过,对内存的地址进行操作。定义如下:#define offsetof(s,m) (size_t)&(((s *)0)->m))。
2.关于结构体和字符串。
在内存中结构体和字符串都一样,一段内存,而结构体不同的是对其进行划分为不同的类型,而字符串全都是字符类型的。所以可以把字符串强制转化为一个结构体。
- struct test
- {
- char a;
- char b;
- };
- char * tmp ="abcdef";
- struct test *pig = malloc(sizeof(struct test));
- *pig = ((struct test *)tmp)[1];
- printf("%c/n",pig->a);
- printf("%c/n",pig->b);
最近看文件系统源代码的时候,没大看懂这个问题。现在明白了。一个字符串里面有很多相似与结构的字符,对其进行强制类型转化后,可以像数组一样操作了。
PS:没事看看源代码,会很有收获的,无论是在语法还是在一定的设计上,都会有很大收获。不断体会UNIX的哲学思想(KISS)。