memcpy在一个具有指针参数指针的不同函数中

时间:2015-01-26 17:01:17

标签: c pointers

我有一个跟随函数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到被调用函数中的解引用位置?

1 个答案:

答案 0 :(得分:0)

问题的代码有几个问题。除了一些语法错误之外,还有一个显着的功能

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来定义缓冲区大小或偏移量,但没有明确的定义或检查可用缓冲区的大小{{ 1}}你复制到 - 或者来自 :-)。提供缓冲区大小比指针限制更常见。

你也有

index

这可能会在... readBytes = dataFileBuffer(index,&readBuf,MAX_LEN); if(readBytes > 0) { index = index+readBytes; } } while(index <= complete); 时导致无限循环,并且无论如何都会在后续循环中复制相同的数据

很抱歉,我无法提供合适的解决方案,因为它很混乱。

在OP评论后添加

在回复有关引用readBytes == 0的具体问题时,此示例通过查找字符串长度成功完成此操作。

**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;
}