我想可能大概是这种感觉吧?
就你叙述的想法而言
Update: 我刚刚发现有地方写错了
typedef struct{
int cmd;
int len;
int data[0]; //define the flexible array member
}rxBuf_s;
int my_recv_UDP(int s, rxBuf_s **mem, int maxlen, struct sockaddr* from, int fromlen) {
char *buffer = malloc(maxlen * sizeof(int));
int length = 0;
// length is actually length from socket
length = Some_UDP_recv_function(s, buffer, maxlen * sizeof(int));
*mem = (rxBuf_s*)malloc(sizeof(int) * (2 + length));
(*mem)->cmd = some_parse_function();
(*mem)->len = length;
memcpy((*mem)->data, buffer, length * sizeof(int));
free(buffer);
return length;
}
int main(){
...
rxBuf_s *rxBuf;
int len = my_recv_UDP(socket, &rxBuf, 100, &ra, sizeof(ra));
// do something to rxBuf
if(rxBuf->data[0] == SOME_NUMBER) {
...
}
free(rxBuf);
...
}
※ 引述《zzss2003 (brotherD)》之铭言:
: 小弟目前在写socket programming(ap层),收底层UDP送过来的资料。
: 其中function:
: int my_recv_UDP(int s,
: void* mem,
: int len,
: struct sockaddr* from,
: int fromlen);
: 用s来当接口,拿mem来收,收的长度为len,并回传实际接收的资料数(可能会比你在
: len 参数中指定的还要少)
: 比如:
: frameLen = my_recv_UDP(socket, rxBuf, 100, &ra, sizeof(ra))
: 拿socket来收,并把资料放到rxBuf里面,放100笔,回传实际接收的资料数(frameLen可能
: 少于100,代表这次的frame不到100笔,当然,也有可能下一次的frame超过100笔)
: 问题:
: 我想写一个struct,然后用此struct型别的指标指向rxBuf,这样我就可以透过这个指标的
: 资料结构看rxBuf里面的东西了
: 比如
: typedef struct{
: int cmd;
: int data[?]; //you don't know the data length
: int len;
: }rxBuf_s;
: rxBuf_s* rxBuf_p = rxBuf;
: rxBuf_p->cmd (rxBuf的cmd), rxBuf->data(rxBuf的data), rxBuf_p->len (rxBuf的len)
: 但...rxBuf里面data的长度不是固定的啊...Orz,这样子我没办法写出一个struct...
: 所以我就想到,我是不是可以"先"把data length给算出来(算得出来),然"后"再把它放到
: struct里,比如:
: typedef struct{
: int cmd;
: int data[lengh]; //this is not allowed in C99 standard
: int len;
: }rxBuf_s;
: 然后编译出来的有问题...
: 上网查了一下发现,C99不允许结构里的阵列大小为变量...
: 这种情况下,我该怎么办呢?
: PS: 上网查过,发现有在结构里把array长度给0的作法,如:
: typedef struct{
: int cmd;
: int len;
: int data[0]; //define the flexible array member
: }rxBuf_s;
: 但这方法并不适用于我这个情况,因为我只是要创造一个ptr,并没有要创造一个变量。