关于元素个数为0的数组使用心得!
2015-11-26 11:04
351 查看
最近上和IBM的一个搞Linux开发的小
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wail.gif)
伙伴聊了一阵子,收获很大,有幸接触这个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;
}
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wail.gif)
伙伴聊了一阵子,收获很大,有幸接触这个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;
}
相关文章推荐
- EsayUI + MVC + ADO.NET(仓储基础接口)
- Jquery操作select
- jsp 页面 input 中指定时间格式
- c++11细粒度的线程安全
- Liunx下 ftp服务器的搭建
- URI中有关@符号的一些猥琐idea
- 黑马程序员——简单工厂模式和单例模式
- 数据结构之堆(java)
- linux命令行
- Android源码在线查看
- 调用手机拍照和浏览相册功能
- Android 混淆问题总结
- 请输入十进制验证码
- 新建用户时的注意事项
- 网络舆情分析技术 读书笔记2
- WebStorm中使用ES6的几种方式
- 安卓获取验证码,并实现倒计时
- Java jdk方式开发webservice并利用Servlet部署到服务器
- 用JavaScriptCore做android和iOS都兼容的JS-NativeSDK
- 目前国内最全面的介绍-Android 中的BroadCastReceiver