位于以下位置的示例文件“usb.c”中
http://www.linux-usb.org/gadget/usb.c
在init_device
函数内部,我无法理解作者想要将缓冲区转换为指针的原因。这是一个缩短的代码段:
char buf [4096], *cp = &buf [0];
int fd;
int status = 0;
char *DEVNAME = "musb-hdrc";
if (status < 0) {
fprintf (stderr, "?? don't recognize /dev/gadget %s device\n", "iso");
return status;
}
fd = open (DEVNAME, O_RDWR);
if (fd < 0) {
perror (DEVNAME);
return -errno;
}
*(__u32 *)cp = 0; /* tag for this format */
cp += 4;
/* write configs */
cp = build_config (cp, hs_eps);
/* and device descriptor at the end */
memcpy (cp, &device_desc, sizeof device_desc);
cp += sizeof device_desc;
status = write (fd, &buf [0], cp - &buf [0]);
char buf [4096], *cp = &buf [0];
int fd;
int status = 0;
char *DEVNAME = "musb-hdrc";
if (status < 0) {
fprintf (stderr, "?? don't recognize /dev/gadget %s device\n", "iso");
return status;
}
fd = open (DEVNAME, O_RDWR);
if (fd < 0) {
perror (DEVNAME);
return -errno;
}
*(__u32 *)cp = 0; /* tag for this format */
cp += 4;
/* write configs */
cp = build_config (cp, hs_eps);
/* and device descriptor at the end */
memcpy (cp, &device_desc, sizeof device_desc);
cp += sizeof device_desc;
status = write (fd, &buf [0], cp - &buf [0]);
作者想要创建吗?不会写入数组的第一个元素的地址只是写入数组?看起来当他真正使用他写给
*cp
的内容时,他最终还是会使用缓冲区......
此外,他究竟在做什么:
*cp
那是某种指向指针的指针吗?为什么要为它添加4然后再将其写入?
我觉得我理解这个程序中发生的大部分事情,但有些事让我感到困惑......
答案 0 :(得分:1)
这意味着“将cp
强制转换为__u32 *
,然后退出(外部*
)并指定0
。
这样做是为了写入正确的字节数(4个字节,假设__u32
是32位类型)。
答案 1 :(得分:1)
作者创建cp
,以便他们有一个指向数组的指针。然后他们可以用cp += 4;
移动指针(我们将看到为什么步骤为4秒)并在这个新位置处进行操作。
*(__u32 *)cp = 0;
首先将指针强制转换为类型__u32*
,我只能假设它是指向4字节无符号整数的指针。然后,他们取消引用此指针并将值0写入它指向的对象。请记住,缓冲区由char
组成,大小为1个字节,指针cp
为char*
。他们将指针转换为__u32*
,这样他们就可以一次写入4个字节的缓冲区。因此,当cp
指向缓冲区中的第一个元素时,它们最终将缓冲区的前4个字节设置为0.这就是为什么它们将指针移动到4个元素,以便它们可以处理后面的所有内容。前4个字节。