关于struct dirent 中d_name成员在某些系统中为1的问题。

此为伸缩型结构成员的问题,详见c primer plus中相关章节

 

1楼 发表于 2007-9-19 23:19   
我在书中看到有以下结构描述.
struct dirent{
.......
.......
char a[1];}
其中a[1]是文件名地址.也有的书用a[255]描述.
我对此非常不解,a[1]怎么能放文件指针呢,作为字符数组,也只能够放'/0'.
请各位释疑,万分感谢.


===========================================================================


2楼 发表于 2007-9-20 09:03  
 


QUOTE:
原帖由 liurengui 于 2007-9-19 23:19 发表 
我在书中看到有以下结构描述.
struct dirent{
.......
.......
char a[1];}
其中a[1]是文件名地址.也有的书用a[255]描述.
我对此非常不解,a[1]怎么能放文件指针呢,作为字符数组,也只能够放'/0'.
请各位释 ... 
一般用于一些变长的数据结构, 方便访问结构体后面的地址. 可以让最后一位为char [0] 或者是 char [1]这种类型
如:

[Copy to clipboard] [ - ]CODE:
struct dirent
{
   int len;
   char a[0];
};

struct dirent *fun(char *str, int len)
{
   struct dirent* n = (struct dirent*)malloc(len +1 + sizeof(struct dirent));
   if (!n)
      return NULL;
   n->len = len;
   memcpy(n->a, str, len);
   return n;
}

===========================================================================

3楼 发表于 2007-9-20 09:20   
楼上是正解,还有一点值得说明的是.这些char a[0] 或者 char a[1] 必须作为结构体的最后一个成员.


===========================================================================

4楼 发表于 2007-9-20 11:37  


QUOTE:
原帖由 web_surf 于 2007-9-20 09:20 发表 
楼上是正解,还有一点值得说明的是.这些char a[0] 或者 char a[1] 必须作为结构体的最后一个成员. 
个人以为, char[0]更似更值得推荐,因为这样不会增加结构的size!而且大多数情况下,更利于对齐!


===========================================================================

5楼 发表于 2007-9-20 12:35   
但是字符数组长度定义成1,只能够存'/0',其他根本就存不下了。
为什么不直接定义成这样,char *a;这样不更简单.


===========================================================================

6楼 发表于 2007-9-20 12:45   
使用了malloc()给其分配了空间的, 所以说它可以有存放数据的空间. 使用char *p的方法也行, 不过这个结构体要多占sizeof(char*)这么多个字节, 在有些空间比较少的领域可以使用这种方式来减少空间的使用.


===========================================================================

7楼 发表于 2007-9-20 16:46  


QUOTE:
原帖由 独孤九贱 于 2007-9-20 11:37 发表


个人以为, char[0]更似更值得推荐,因为这样不会增加结构的size!而且大多数情况下,更利于对齐! 
说得一点都没错,不过我有点疑惑, 既然是char [0], sizeof(struct)也没发现这个变量占用了内存空间,但还是可以访问这个变量.奇怪,晚上会去查查c99怎么定义char[0]的.

查到了, c99这样定义的
struct s
{
  int a;
  char b[];
};

struct ss
{
  int a;
  char b[1];
};

sizeof(struct s) = offsetof(struct s, b) = offsetof(struct ss, b);


===========================================================================

8楼 发表于 2007-9-20 16:54  


QUOTE:
原帖由 liurengui 于 2007-9-20 12:35 发表 
但是字符数组长度定义成1,只能够存'/0',其他根本就存不下了。
为什么不直接定义成这样,char *a;这样不更简单. 
谁说长度为1就只能存'/0'了.malloc时扩展了size的. 而扩展的size正好在struct的尾端, 也就是说扩展的内存跟最后一个成员char p[0]的地址是相邻的. 也就是说可以通过成员char p[0]访问.
用char p[0]比char *p的好处是:
(1) 前者malloc之后不需要给p赋值,因为前者是array.
(2) 前者实现了一个动态数组的功能,如果不需要,他根本就可以不占用任何内存,而后者会占用4个字节.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值