您的位置:首页 > 编程语言 > C语言/C++

C语言零长度数组

2013-11-15 18:22 141 查看
零长度数组在ANSI C 和C++中是不允许的,在GNU C中是可以合法使用的。看urb的结构体可以看到:

struct urb {
/* private: usb core and host controller only fields in the urb */
struct kref kref;		/* reference count of the URB */
void *hcpriv;			/* private data for host controller */
atomic_t use_count;		/* concurrent submissions counter */
atomic_t reject;		/* submissions will fail */
int unlinked;			/* unlink error code */

/* public: documented fields in the urb that can be used by drivers */
struct list_head urb_list;	/* list head for use by the urb's
* current owner */
struct list_head anchor_list;	/* the URB may be anchored */
struct usb_anchor *anchor;
struct usb_device *dev;		/* (in) pointer to associated device */
struct usb_host_endpoint *ep;	/* (internal) pointer to endpoint */
unsigned int pipe;		/* (in) pipe information */
unsigned int stream_id;		/* (in) stream ID */
int status;			/* (return) non-ISO status */
unsigned int transfer_flags;	/* (in) URB_SHORT_NOT_OK | ...*/
void *transfer_buffer;		/* (in) associated data buffer */
dma_addr_t transfer_dma;	/* (in) dma addr for transfer_buffer */
struct scatterlist *sg;		/* (in) scatter gather buffer list */
int num_sgs;			/* (in) number of entries in the sg list */
u32 transfer_buffer_length;	/* (in) data buffer length */
u32 actual_length;		/* (return) actual transfer length */
unsigned char *setup_packet;	/* (in) setup packet (control only) */
dma_addr_t setup_dma;		/* (in) dma addr for setup_packet */
int start_frame;		/* (modify) start frame (ISO) */
int number_of_packets;		/* (in) number of ISO packets */
int interval;			/* (modify) transfer interval
* (INT/ISO) */
int error_count;		/* (return) number of ISO errors */
void *context;			/* (in) context for completion */
usb_complete_t complete;	/* (in) completion routine */
struct usb_iso_packet_descriptor iso_frame_desc[0];
/* (in) ISO ONLY */
};
        首先零长度的数组是不占用内存的,在为一般结构体分配内存时首先为结构体分配一块内存空间,其次为结构体中的成员变量分配内存空间,这样两次分配的内存空间是不连续的,需要分别对其进行管理。当使用零长度数组时,则是采用一次分配的原则,一次性将所需的内存分配给它,并且内存是连续的。通过申请一段结构体长度加可变长度的内存空间,零长度数组就可以指向可变长度的内存空间,并可采用数组的方式对齐访问。
       对于usb同步传输分包的问题,在一个urb的传输中可以使用零长度数组灵活地进行分包处理。  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: