【问题标题】:memcpy in a different function having a pointer to pointer argumentmemcpy 在具有指向指针参数的指针的不同函数中
【发布时间】:2015-01-26 17:01:16
【问题描述】:

我有一个以下函数process 调用一个例程dataFileBuffer,它接受一个指向指针的指针并在取消引用的指针位置上执行memcpy。

int dataFileBuffer(uint8_t *index, char **tempBuf,int size)
{   
   if(index != stop_address)) /*stop_address is a fixed pointer to the end buffer*/
   {
      if(*tempBuf)
      {
        if(index + size < stop_address)
            memcpy(*tempBuf,index,size);
        else
        {
            size  = stop_address-index-1;               
            memcpy(*tempBuf,index,size);    
        }
      }
      else
        size = 0;
  }
  else  
    size = 0;   
  return size;
}

int process()
{
    char *readBuf=NULL;    
    char *tBuf = (char *)malloc(MAX_LENGTH); 
    int readBytes = -1;
    uint8_t *index = start_address;
    uint8_t *complete = stop_address;
    do 
    {

       readBuf = tBuf+(sizeof(char)*40);
       readBytes = 0;
       readBytes = dataFileBuffer(index,&readBuf,MAX_LENGTH);
       if(readBytes > 0)
       {
           index = index+readBytes;
       }

   }while(index <= complete);
   return readBytes;
}

我的 process 函数间歇性地看到堆栈损坏,这让我认为我的复制实现有问题。

我只是想了解我们是否可以将指向指针的指针作为参数传递并安全地 memcpy 到被调用函数中的取消引用位置?

【问题讨论】:

  • 你是在编写c还是c++?
  • 不要在 c. 中投射 malloc
  • 当您在有问题的malloc 行放置断点时,指针的内容是否在正确的区域?您必须使用调试器来获取此信息。
  • 你为什么选择char**?你不修改调用者的指针,所以只需传递它char*
  • sizeof(char) 始终为 1,这是标准规定的。

标签: c pointers


【解决方案1】:

问题的代码有几处错误。除了一些语法错误之外,还有一个值得注意的函数

dataFileBuffer(index, char **tempBuf,int size)

没有编译有两个原因,没有为参数index声明类型,也没有声明返回值——注意函数以

结尾
return size;

并且是这样调用的:

readBytes = dataFileBuffer(index,&readBuf,MAX_LEN);

我猜应该是这样

int dataFileBuffer(char *index, char **tempBuf, int size)

但我很困惑,为什么您将 dataFileBuffer() 的论点颠倒了 memcpy()

接下来,您使用MAX_LENMAX_LENGTH40 定义缓冲区大小或偏移量,但没有明确定义或检查您复制到的可用缓冲区index 的大小 -或者是来自 :-)。提供缓冲区大小比提供指针限制更常见。

你也有

...
readBytes = dataFileBuffer(index,&readBuf,MAX_LEN);
if(readBytes > 0)
    {
        index = index+readBytes;
    }
} while(index <= complete);

readBytes == 0 时可能会导致无限循环,并且无论如何都会在后续循环中复制相同的数据

抱歉,我无法提供合适的解决方案,因为这一切都是一团糟。

在 OP 评论后添加

在回答有关推迟**pointer 的具体问题时,此示例通过查找字符串长度成功地做到了这一点。

#include <stdio.h>
#include <string.h>

// return the length of the string
size_t slen(char **tempBuf)
{   
    return strlen (*tempBuf);
}

int main(void) {
    char string[] = "abcde";
    char *sptr = string;
    printf ("Length of '%s' is %d\n", string, slen (&sptr));
    return 0;
}

程序输出:

Length of 'abcde' is 5

【讨论】:

  • 感谢 cmets,我很抱歉我的伪代码类型的复制粘贴代码,我只是想添加与问题相关的代码部分,并对我的代码类型有一些可见性我在谈论。实际的代码功能远不止这些。我在代码中添加了一些编辑。我想我应该更具体地提出以下问题:是否可以取消引用指向被调用函数中指针的指针并在其上使用 memcpy ?
  • @cmidi 你应该发布一个最小可编译示例来演示错误。如果您发布的代码与您的代码“类似”,那么您只会浪费评论者查找“正确”程序中不存在的错误的时间。有故障,请不要发布虚假故障。
  • 抱歉浪费了您的时间。
  • @cmidi 我已经改进了我的帖子以回答您的具体问题 - 测试 ** 取消引用。
猜你喜欢
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多