- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试调试由其他人编写的一段代码,该代码在 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/
您好,我在 Java 中使用直接缓冲区,我需要对它们进行快速内存复制。在 C 中有 memcpy 命令,在 Java 数组中我有 Arrays.copyOf。但是没有办法使用数组而不是直接缓冲区,因为
我有两个结构 struct word_count_struct { char *word; int count; }; 和 struct bag_struct { struct
我正在尝试调试由其他人编写的一段代码,该代码在 memcpy 操作期间有时会导致段错误,但并非总是如此。 另外,如果有人能帮助我翻译 memcpy 之前发生的一段代码中发生的情况,我将非常感激。 首先
我正在编写一个混合程序,当发生更改(添加新子弹、添加新敌人、删除敌人或子弹)时,该程序将包含 Sprite vector 的结构从服务器发送到客户端。该程序经常将几个敌人添加到结构中的 vector
这里的问题是了解在通过函数的返回对象初始化 vector 时是否调用了复制或 move 构造函数。使用探查器检查 mallocs 在两种情况下显示相似的 memcopies。为什么? 我们有一个类型为
所以每当我编写代码时,我总是会考虑性能影响。我经常想知道,就性能而言,相对于其他功能而言,使用 memcopy 的“成本”是多少? 例如,我可能正在将一系列数字写入静态缓冲区并专注于缓冲区中的帧,以便
我有 shift 函数,我不断向它发送新的数据点,它会将我的点偏移 1。这是为了实现“图形移位”,其中点代表图形上的点。 移位函数如下: void Chart_Buffer::ShiftData()
所有,我不知道我达到了什么限制,也不知道这是否是 valgrind、libc 或 me 的问题,但我需要知道这是否可以重现,如果可以,问题出在哪里。我已将问题归结为可在我的 2 个 AMD 机器上生成
我是一名优秀的程序员,十分优秀!