我有一个函数返回一个数据字,我需要把它放在一个结构中;但是,当我操纵任何指针时,我并没有在正确的边界上。
我可能更容易展示:
void grab_object(size_t copies, struct iovec *iov)
{
union u {
long val;
char chars[WORD_SIZE];
}data;
iov = malloc(sizeof(struct iovec) * copies);
size_t numWords = (sizeof(struct iovec) * copies) / WORD_SIZE;
if(DEBUG)
{
printf("numWords %zx\n", numWords);
printf("size of word %zx\n", WORD_SIZE);
}
size_t x = 0;
for(x = 0; x < copies; x++)
{
size_t i = 0;
struct iovec *laddr = iov;
while(i <= numWords)
{
data.val = function()
memcpy(laddr, data.chars, WORD_SIZE);
laddr += WORD_SIZE;
i++;
}
size_t remainder = size % (WORD_SIZE);
if(remainder != 0)
{
data.val = function();
memcpy(laddr, data.chars, remainder);
}
}
}
这会将数据复制到struct的第一个元素中;但是,它并没有在第二个。
当我打印元素和laddr的地址时,我得到类似于以下内容的内容:
iov_len loc: 0x9a5148
starting laddr: 0x9a5140
after incrementing laddr: 0x9a5150
iov_len loc: 0x9a5148
starting laddr: 0x9a5150
after incrementing laddr: 0x9a5160
那么为什么laddr递增0x10而不是1,我将如何在&#34;之间复制&#34;数据(iov_len
)?
答案 0 :(得分:0)
char *chars[sizeof(long)];
声明指向字符的指针数组。
你应该写
char chars[sizeof(long)];
PS:原作者解决了这个问题,但他的代码存在更多问题。
答案 1 :(得分:-2)
因此,当user31264暗示时,laddr
的增加幅度为struct iovec
。
简单的解决方案是使用均匀分为struct iovec
大小的数据类型。幸运的是,char总是1个字节。所以:
char *laddr = (char *)iov;
声明我们的容器和
laddr += sizeof(long);
增加一个字。