gpt4 book ai didi

c - memcopy 上的段错误,谁能解释一下这段代码中的 C 语法?

转载 作者:行者123 更新时间:2023-11-30 17:31:57 27 4
gpt4 key购买 nike

我正在尝试调试由其他人编写的一段代码,该代码在 memcpy 操作期间有时会导致段错误,但并非总是如此。

另外,如果有人能帮助我翻译 memcpy 之前发生的一段代码中发生的情况,我将非常感激。

首先,我们有一个函数,向其中传递一个 void 指针和一个指向结构的指针,如下所示:

  void ExampleFunction(void *dest, StuffStruct *buf)

结构看起来像这样:

typedef struct {
char *stuff;
unsigned int totalStuff;
unsigned int stuffSize;
unsigned int validStuff;

} StuffStruct;

返回示例函数。在 ExampleFunction 内部,正在发生这种情况:

void *src;
int numStuff;
numStuff = buf->validStuff;
src = (void *)(buf->stuff);

我对上面的行感到困惑。当 buf->stuff 中的 char 数组转换为 void 指针,然后设置为 src 的值时,到底会发生什么?我无法遵循该步骤应该发生的情况。

紧接着,memcpy 发生:

memcpy(dest, src, buf->bufSize*numStuff)

这就是段错误经常发生的地方。我检查了 dest/src 是否为空,两者都不为空。

此外,在调用ExampleFunction 的函数中,dest 的数组被声明为大小为5000(如果有的话)。然而,当我在上面的代码中打印 buf->bufSize*numStuff 中的值时,该值通常高于 5000——它可以高达 80,000——不过,没有段错误。也就是说,它运行良好,长度变量 (buf->bufSize*numStuff) 远高于 dest 变量初始化时的假定长度。但是,也许这并不重要,因为它被转换为 void 指针?

由于各种原因,我无法使用 dbg 或安装 IDE。我只是使用基本的 printf 调试。有人有我可以探索的想法吗?预先感谢您。

最佳答案

首先,转换和赋值只是将 buf->stuff 的地址复制到指针 src 中。那里没有魔法。

numStuff = buf->validStuff;
src = (void *)(buf->stuff);

如果 dest 的存储空间仅够容纳 5000 字节,并且您尝试写入超出该长度的内容,那么您就会破坏程序堆栈,这可能会导致副本上或有时稍后出现段错误。无论是否转换为 void 指针都没有任何区别。

memcpy(dest, src, buf->bufSize*numStuff)

我认为您需要准确地弄清楚 buf->bufSize*numStuff 应该计算什么,如果不正确(不是有意的),则修复它,将副本截断为目标,或增加目标数组的大小。

关于c - memcopy 上的段错误,谁能解释一下这段代码中的 C 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398216/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com