LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5625|回复: 12

长度为0的数组能有什么用处?

[复制链接]
发表于 2007-10-5 22:11:49 | 显示全部楼层 |阅读模式

  1. /**
  2. * struct VOLUME_NAME - Attribute: Volume name (0x60).
  3. *
  4. * NOTE: Always resident.
  5. * NOTE: Present only in FILE_Volume.
  6. */
  7. typedef struct {
  8.         ntfschar name[0];        /* The name of the volume in Unicode. */
  9. } __attribute__((__packed__)) VOLUME_NAME;
复制代码
发表于 2007-10-5 22:26:22 | 显示全部楼层
也许是为了日后进行 realloc。不过建议不要申请这样的东东
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-5 22:39:24 | 显示全部楼层
Post by remote fish
也许是为了日后进行 realloc。不过建议不要申请这样的东东

不明白你说的意思。。。
回复 支持 反对

使用道具 举报

发表于 2007-10-6 21:59:49 | 显示全部楼层
我觉得搜索下代码的其他地方怎么用的这个东西可能有助于理解。
Post by remote fish
也许是为了日后进行 realloc。不过建议不要申请这样的东东

栈上分配的东东不能 realloc 的。
回复 支持 反对

使用道具 举报

发表于 2007-10-7 10:46:24 | 显示全部楼层
sorry,没看代码,只看了楼主的标题,以为问的是 malloc(0) 这样的东东。
回复 支持 反对

使用道具 举报

发表于 2007-10-7 10:50:51 | 显示全部楼层
0长度的数组:在标准c里面,是不允许0长度的数组的,gcc允许。的确带来了一些方便吧。最主要的应用是表示可变长度的内容时。
例如:
struct line
{
int length;
char contents[0];
};
struct line * x = (struct line*)malloc(sizeof(struct line) + content_length);
x->length = content_length;
在标准c里面,contents长度至少为1才行,这样写malloc的时候长度计算就要复杂一点。
回复 支持 反对

使用道具 举报

发表于 2007-10-7 10:57:48 | 显示全部楼层
感谢 realtang 兄的精彩解答。
回复 支持 反对

使用道具 举报

发表于 2007-10-7 13:17:59 | 显示全部楼层
Post by realtang
0长度的数组:在标准c里面,是不允许0长度的数组的,gcc允许。的确带来了一些方便吧。最主要的应用是表示可变长度的内容时。
例如:
struct line
{
int length;
char contents[0];
};
struct line * x = (struct line*)malloc(sizeof(struct line) + content_length);
x->length = content_length;
在标准c里面,contents长度至少为1才行,这样写malloc的时候长度计算就要复杂一点。
realtang 前辈这段示例代码貌似来自:
http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
但这段代码似乎存在内存泄露隐患: malloc 的长度和 struct line 的长度不一致,这样将来在 free(x) 的时候,势必 content_length 长度的内存将会泄露?还请 realtang 前辈指点。

realtang 前辈例子中的可变长度似乎最好直接定义为指针再单独分配空间:
  1. struct line {
  2.   int length;
  3.   char* contents;
  4. }
  5. ...
  6. struct line * x = (struct line*)malloc(sizeof(struct line));
  7. x->length = content_length;
  8. x->contents = (char *)malloc(x->length);
复制代码
或许那些不符合 C 标准的做法反而成为 C 被指责为不安全语言的例证
回复 支持 反对

使用道具 举报

发表于 2007-10-8 08:51:11 | 显示全部楼层
很多时候一项语言特性在带来优点的同时也必然会伴随着缺点。写程序,关键还是在人,语言终究只是一种手段
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-8 17:15:55 | 显示全部楼层
Post by realtang
0长度的数组:在标准c里面,是不允许0长度的数组的,gcc允许。的确带来了一些方便吧。最主要的应用是表示可变长度的内容时。
例如:
struct line
{
int length;
char contents[0];
};
struct line * x = (struct line*)malloc(sizeof(struct line) + content_length);
x->length = content_length;
在标准c里面,contents长度至少为1才行,这样写malloc的时候长度计算就要复杂一点。

下面是不是典型的用法?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main() {
  5.         struct line {
  6.                 int length;
  7.                 char content[0];
  8.         };

  9.         char *hello = "Hello";

  10.         struct line * x = (struct line*)malloc(sizeof(struct line) + strlen(hello) + 1);
  11.         x->length = strlen(hello) + 1;
  12.         strcpy(x->content,hello);
  13.         printf("%s\n",x->content);
  14.   return 0;
  15. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表