碰见C语言的几个小问题

最近碰见C语言的几个小问题。

1.关于结构体的大小(sizeof)。

  1. /*struct assign
  2.   {
  3.     char a;
  4.     int  b;
  5.     char c;
  6.   };
  7.   */
  8.   struct assign
  9.   {
  10.     char a;
  11.     char b;
  12.     int c;
  13.   };
  14.   int i = offsetof(struct assign,b);
  15.   printf("%d/n",sizeof(struct assign));
  16.   printf("%d/n",i);

分别声明以上两种结构体,分析结构体的长度。

第一种应该为12,第二种应该为8.这个主要是内存对齐问题。32位机,为了提高速度,是不会把一个int型的放在2个32位的空间里面的。 因为当读取的时候会读取两次,系统不允许这样做的。也可以用offsetof求其中的一个结构体中的变量相对与结构体首部的位置。

(offsetof是一个宏,上次写可变长的函数时候就说过,对内存的地址进行操作。定义如下:#define offsetof(s,m) (size_t)&(((s *)0)->m))。

 

2.关于结构体和字符串。

     在内存中结构体和字符串都一样,一段内存,而结构体不同的是对其进行划分为不同的类型,而字符串全都是字符类型的。所以可以把字符串强制转化为一个结构体。

  1.  struct test
  2.   {
  3.     char a;
  4.     char b;
  5.   };
  6.   char * tmp ="abcdef";
  7.   struct test *pig = malloc(sizeof(struct test));
  8.   *pig = ((struct test *)tmp)[1];
  9.   printf("%c/n",pig->a);
  10.   printf("%c/n",pig->b);

最近看文件系统源代码的时候,没大看懂这个问题。现在明白了。一个字符串里面有很多相似与结构的字符,对其进行强制类型转化后,可以像数组一样操作了。

PS:没事看看源代码,会很有收获的,无论是在语法还是在一定的设计上,都会有很大收获。不断体会UNIX的哲学思想(KISS)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值