【发布时间】:2016-08-29 00:51:31
【问题描述】:
我有一个返回一个数据字的函数,我需要把它放在一个结构中;但是,当我操作任何指针时,我不在正确的边界上。
对我来说可能更容易展示:
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);
}
}
}
这会将数据复制到结构的第一个元素中;但是,它不会在第二个。
当我打印元素和 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,我将如何复制“中间”数据 (iov_len)?
【问题讨论】:
-
该代码似乎会无限递归-它以
void function()开头,在for()循环的第一行你有_U.val = function();-它调用function(),它开始另一个for()循环调用function()。 -
你需要发布一套完整的实际编译的代码。见Minimal Complete Verifiable Example。
-
@user3386109 已更新
-
laddr递增0x10,显然是sizeof(struct iovec)。 -
这个不完整的代码中有很多错误。从哪儿开始...?您的描述中“边界”的定义是
iov->iov_len成员的地址吗?如果是,为什么您认为iov_len是iov中的第一个元素?函数签名是什么样的,您希望如何使用它?size来自哪里?为什么函数底部有无限循环?为什么在循环结束时将laddr增加到另一个struct iovec的(可能)无效位置?
标签: c pointers memory-management