一个语言语法问题!(送分题一个)

猎人66 2001-02-16 12:10:00
菜鸟我偶然看到有如下代码:

typedef struct __XXXXXX
{
DWORD i;
DWORD data;
char szBuf[0];
}XXXXX;

菜鸟我对其中的“char szBuf[0];”一句百思不得其解,不知其有何妙用?

是否等于 char*szBuf?编译器对此句有警告!

望各位大虾解疑?
...全文
480 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkay 2001-02-18
  • 打赏
  • 举报
回复
我认为是用来实现强制类型转换的时候使用的。而且不能用char *p;来代替
先看看以下的例子:
#include <iostream>
#include <string>
using namespace std;
typedef struct __test1
{
int i;
char buf[1];
}test1;

typedef struct __test2
{
int i;
char buf[255];
}test2;

void function(test1 *tt)
{
//do something;
cout<<(tt->buf)<<endl;
}
void main()
{
test2 tt;
memset(tt.buf,0,sizeof(tt.buf));
memcpy(tt.buf,"this is a test string!",sizeof("this is a test string!"));
function((test1 *)&tt);
}
有时候在程序设计的时候出现和test1很相似但是buf的大小不一样的结构(我在做ASN1的编译器的时候就遇到这种情况),而function对这些结构都进行相同的处理(在本例子中是打印该字符串),同时处理本身又和buf的实际大小无关或可以通过传递参数来决定,这样为了可以统一处理就会使用test1这样一个结构。其实这种用法是C语言中比较常用,在C++中可以通过继承的方法实现同样的目的,而且看起来更规范。现在说明以下为什么不能用char *p;来代替,当编译器在进行类型转换的时候进行的仅仅是一个地址的拷贝,当在test1中用char *p;来定义的时候,由于sizeof(char *);的值是4个字节,所以将test2中buf[0],buf[1],buf[2],buf[3]这四个数的值复制给p指针,现在不用我说p指针肯定是非法的拉。但是如果test1中定义的是数组的话就能够将test2中的数组首地址进行正确的复制(以上关于指针复制的结构,你可以自己跟踪一下就明白了)。最后我建议将开始定义中的char szBuf[0]改为char szBuf[1]就不会出现警告了。
wuzhouqun 2001-02-17
  • 打赏
  • 举报
回复
那变长数据的内存空间是何时分配的,分配多大?
猎人66 2001-02-17
  • 打赏
  • 举报
回复
江湖确有高人,分我会稍后给,请放心!
aoao 2001-02-17
  • 打赏
  • 举报
回复
又学了一招.
xcex 2001-02-17
  • 打赏
  • 举报
回复
哦...
猛禽 2001-02-17
  • 打赏
  • 举报
回复
一般是用char[1]吧,比如WindowsSDK中定义BMP的俽板就是定义为RGBQUAD[1]的。
E 2001-02-16
  • 打赏
  • 举报
回复
此中定义在网络协议实现时经常用到,
szBuf中有可变长的数据。比如说某协议数据格式:
-------------------------------------------------------------------------
| type(4bytes) | length(4byte) | data (变长)
-------------------------------------------------------------------------
就可以定义类似的结构表示该数据格式。
typedef struct __XXXXXX
{
DWORD type ;
DWORD length;
char szBuf[0];
}XXXXX;

void ProcessInput(char* p) //p 为接收到的数据的指针。
{
XXXXX pXXXXX = (XXXXX *)p;

datatype = pXXXXX->type;
dataLength =pXXXXX->length;
//......
memcpy(data,pXXXXX->szBuf, dataLength );

}





feeing 2001-02-16
  • 打赏
  • 举报
回复
我想有两种可能,一种是指该字符串只有一个字符,
另一种可能是个字符指针,但是一个不安全的指针.
MrZhang 2001-02-16
  • 打赏
  • 举报
回复
只是占个位置,不占内存。给人看看的,没用的。
isdom 2001-02-16
  • 打赏
  • 举报
回复
struct XXXXX
{
DWORD type;
DWORD length;
char *p;
};
中 p 所分配的空间 不一定(几乎是肯定不) 和

DWORD type;
DWORD length;

所在的空间连续,

比较:
struct XXXXX
{
DWORD type;
DWORD length;
char *p;
};

+----------+
| type |
+----------+
| length |
+----------+
| p ------|------->+-------+
+----------+ | 数据 |
.......
| |
+-------+


typedef struct __XXXXXX
{
DWORD type ;
DWORD length;
char szBuf[0];
}XXXXX;

+----------+
| type |
+----------+
| length |
+----------+ <--- 起始地址可以用szBuf表示
| 数据 |
.......
| |
+----------+


ychener 2001-02-16
  • 打赏
  • 举报
回复
请问wao(wao) 
struct XXXXX
{
DWORD type;
DWORD length;
char *p;
};
有什么错误?

jiagh 2001-02-16
  • 打赏
  • 举报
回复
char szBuf[0];
这个语法之所以有警告, 以小生之鉴是因为:当编译器为它申请内存空间时,要把数组的首地址

返回给szBuf这个变量,但是这个数组的元素个数是0,所以没有申请到内存——也就是没有地址
返回给szBuf, 所以会有警告!


wao 2001-02-16
  • 打赏
  • 举报
回复
struct _XXXXX
{
DWORD type;
DWORD length;
char *p;
}
这个用法是错误的。
ychener 2001-02-16
  • 打赏
  • 举报
回复
不好意思写错了应该是
但是后一种定义方法大小应是 SIZE=sizeof(XXXXX)+sizeof(AnotherDataPack)+4
ychener 2001-02-16
  • 打赏
  • 举报
回复
这是一个经验问题,通常用于数据包的拼合,其效果和
struct _XXXXX
{
DWORD type;
DWORD length;
char *p;
}
差不多


但是为什么不这样定义呢?
因为原定义方法在程序中sizoof(XXXXX)=sizeof(DWORD)*2
在数据包拼合的时候大小应是 SIZE=sizeof(XXXXX)+sizeof(AnotherDataPack)
但是后一种定义方法大小应是 SIZE=sizeof(XXXXX)+sizeof(AnotherDataPack)-4
(在位系统32中sizeof(char *)=4)
会在程序中不好理解

原定义还有一个好处就是访问后边接上的变长数据包时可以用szBuf[n]来进行访问!
ychener 2001-02-16
  • 打赏
  • 举报
回复
这是一个经验问题,通常用于数据包的拼合,其效果和
struct _XXXXX
{
DWORD type;
DWORD length;
char *p;
}
但是为什么不这样定义呢?
因为原定义方法在程序中sizoof(XXXXX)=sizeof(DWORD)*2
在数据包拼合的时候大小应是 SIZE=sizeof(XXXXX)+sizeof(AnotherDataPack)
但是后一种定义方法大小应是 SIZE=sizeof(XXXXX)+sizeof(AnotherDataPack)-4
(在位系统32中sizeof(char *)=4)
会在程序中不好理解

原定义还有一个好处就是访问后边接上的变长数据包时可以用szBuf[n]来进行访问!






FBStudio 2001-02-16
  • 打赏
  • 举报
回复
这种用法是为了处理变长的数据,且只能位于结构末尾,变长数据内还可包含变长的数据。
以前用VC5.0时好象没有警告。
ratio2000 2001-02-16
  • 打赏
  • 举报
回复
这是为了处理可变长的数据。
xyzboat 2001-02-16
  • 打赏
  • 举报
回复
原来如此

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧