您的位置:首页 > 其它

关于元素个数为0的数组使用心得!

2015-11-26 11:04 351 查看
最近上和IBM的一个搞Linux开发的小

伙伴聊了一阵子,收获很大,有幸接触这个0数组的使用。


大家有没有人见过,在WINDOWS的头文件里经常有这样的情况出现。例如:

typedef struct _TestStruct_

{

int
nItemCount;

ANY_TYPE
item[0];

}TEST_STRUCT;

此时,用sizeof(TEST_STRUCT)得到的数值为4,即sizeof(int),后面的在结构体里是不占空间的。

另外,有个结构体定义如下:(别人定义的)

struct ss_t{

int s_id;

int len;

char *msg;

};

代码中,有类似下面的一段:

struct ss_t *st;

...

st = (struct ss_t *)buf;

将buf强制转换成struct ss_t类型。

然后对st操作:

当对st->msg操作时,出错。

printf("%s\n", st->msg);

显然,这边msg只是一个指针,指针的指向不知道,所以就出错了。我开始的解决办法是抛

弃这个结构体直接对buf进行操作,改动颇大。后来,想想,能不能改动小点。记得之前听过别人说C语言的0数组,就试试了。把结构体的定义换成:

struct ss_t{

int s_id;

int len;

char msg[0];

};

然后再编译运行,正常工作。其实,结构体对0数组时没有分配空间的,但是,相当于定义了一个数组,数组没有元素,但是,数组的首地址又是刚好在len之后。引用msg,就相当于对那块地址操作了。所以,问题顺利解决。

此时,sizeof(struct ss_t) = 8;

另外,把其中的0去掉,定义成如下:

struct ss_t{

int s_id;

int len;

char msg[];

};

程序还是照常运行。

此时,sizeof(struct ss_t) = 8。

可见,有没有0俩者一样,而且运行效果也一样。

这里,msg相当于一个常量指针.不过, 读取st->msg:

printf("%s", st->msg);输出123456

ok,成功了

我写的一个完整例子:

#include

#include

#define INT_LEN sizeof(int)

struct ss_t{

int s_id;

int len;

char msg[];

};

int main(void)

{

int id;

int len;

char msg[] = "123456";

char *buf;

struct ss_t *st;

buf = (char *)malloc(sizeof(char) * 100);

if (buf == NULL) {

return 1;

}

memset(buf, 0, 100);

id = 65;

len = 66;

memcpy(buf, &id, INT_LEN);

memcpy(buf + INT_LEN, &len, INT_LEN);

memcpy(buf + 2 * INT_LEN, msg, strlen(msg));

st = (struct ss_t *)buf;

printf("st->s_id %d st->len %d\n", st->s_id, st->len);

printf("st->msg %s\n", st->msg+1);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: