我有一个跟随函数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到被调用函数中的解引用位置?
答案 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_LEN
,MAX_LENGTH
和40
来定义缓冲区大小或偏移量,但没有明确的定义或检查可用缓冲区的大小{{ 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;
}