操纵指向任意位置的指针

时间:2016-05-03 19:54:27

标签: c pointers memory-management

我有一个函数返回一个数据字,我需要把它放在一个结构中;但是,当我操纵任何指针时,我并没有在正确的边界上。

我可能更容易展示:

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)?

2 个答案:

答案 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);

增加一个字。