问题标签 [memmove]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
910 浏览

c - 使用 memmove 代替 memcpy 的示例

区别:如果有重叠,使用memmove代替memcpy

问:您能否提供任何 C lib 函数发生重叠的实际场景,因此使用 memmove 代替memcpy

0 投票
4 回答
3033 浏览

c++ - memmove vs 向后复制

我知道memmove在 C (cstring 库)中处理重叠很好“以较慢的运行时间为代价”(见这篇文章)。我想知道为什么这个额外的运行时成本?在我看来,任何重叠问题都可以通过向后而不是向前复制来解决,我错了吗?

作为一个玩具示例,这里有两个版本的“右移”函数,它将数组的内容向右移动一个元素:

它们是等价的吗?性能方面,哪一个最好用?


注意:从@DieterLücking 的评论来看,尽管采取了预防措施,但memmove在这种情况下使用上述版本是不安全的。

0 投票
0 回答
156 浏览

c - 调用 memmove 或 memcpy 是否定义了 NULL?

我刚刚在我的设置(gcc 4.8.2,最近的 uClibc)上测试了以下内容,它运行良好:

它也适用于memcpy. 所以很明显,将NULLs 传递给这些函数在实践中可以正常工作,至少在某些设置上是这样。但我想进行防御性编码,并试图确定是否有任何 C 标准允许我依赖这种行为,或者它是未定义的还是实现定义的。

这个答案指出,C99 标准确实指定将 0 的大小传递给这些函数应该是有效的。这是第 7.21.1 节中的文本:

如果声明为 size_t n 的参数指定函数数组的长度,则 n 在调用该函数时可以具有零值。除非在本小节中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如 7.1.4 中所述。在这样的调用中,定位字符的函数找不到出现,比较两个字符序列的函数返回零,复制字符的函数复制零字符。

另一方面,阅读第 7.1.4 节似乎说NULL未定义传递 s :

除非在随后的详细描述中另有明确说明,否则以下每个语句都适用: 如果函数的参数具有无效值(例如函数域之外的值,或程序地址空间之外的指针,或空指针,或指向不可修改存储的指针(当相应参数不是 const 限定时)或具有可变数量参数的函数不期望的类型(提升后),行为未定义。

这也是你的理解吗?任何人都可以确认/否认该标准是否未定义此行为吗?

我主要针对 C99,但也欢迎有关其他 C 标准的反馈。

0 投票
4 回答
1149 浏览

c++ - /Does/ memmove 使用中间缓冲区吗?

这是一个出于好奇而不是任何重要的问题,但我只是想知道memmove 文档中的以下代码段:

复制就像使用了中间缓冲区一样发生

(强调我的)。该公式向我表明,是否使用中间缓冲区是特定于编译器实现的。

如果您要我写memmove,我可能会自动执行以下操作:

  • n在堆上分配字节
  • memcpy温度的来源
  • memcpy到目的地的温度
  • 释放缓冲区

我希望任何人都可以...

  1. ...确认该公式是否只是因为用户更容易可视化正在发生的事情,而没有解决特定实现实际上必须使用中间缓冲区的问题;
  2. ...阐明了一些常见 C++ 编译器(如或 Visual C++)中的实际gcc实现- 例如,是否使用缓冲区并检查重叠是否可以memcpy直接执行;
  3. ...也许指出我上面的简单算法中明显的错误/效率低下。
0 投票
2 回答
1265 浏览

c - 当我知道重叠面时,memmove() 替代方案是什么?

我想知道将 n 个字节从 *source 复制到 *destination、when *destination = *source + kk is netural or zero.

memcpy() 函数具有未定义的重叠行为。

memmove() 函数不是最好的,因为它必须检查重叠的一面。

还有另一个最适合我的功能吗?

提前致谢!

0 投票
0 回答
115 浏览

c++ - 如何检查是否已使用 C++ 分配器分配了部分内存?

有没有办法确定内存的特定部分是否包含在单个 C++ 分配的块中?不幸的是,在发布模式下。理想情况下在 Windows 和 Mac 上。

我这里有一个非常有问题的错误 - 它只出现在发布模式下,它非常难以模拟,多线程并且通常会破坏堆栈。它似乎是由调用 memmove 引起的,我唯一的猜测是它正在替换很大一部分内存,并且在访问冲突发生之前它通常已经替换了堆栈。

该算法非常复杂,并且不时发生这种情况,不知道如何有效地模拟它,所以我唯一的想法是将测试植入 memmove 以确保参数正确。当然,每个部分都应该位于一个分配器块中,所以我需要检查被替换的特定块是否正确。

0 投票
5 回答
9360 浏览

arrays - 将数组从某个位置复制到c中的另一个数组

我有数组 A,我想将此数组从位置 x 复制到 y 到 C 语言中的另一个数组。请帮助在 c 中创建它。

使用 memcpy 仅从头开始复制数组。我想从特定位置复制到另一个位置。

0 投票
1 回答
521 浏览

algorithm - Rust 中是否有 C++ std::copy 的等价物?

C++ 中的std::copy函数将一个迭代器指向的元素复制到另一个迭代器指向的元素上。C++ 中的一个重要方面std::copy是,良好的实现通过使用std::memmoveif 迭代元素的类型是TriviallyCopyableC++ 语言(一种实现CopyRust 特征的类型)进行优化。

std::copyRust 标准库中目前是否有与 C++ 等效或相似的内容?

0 投票
0 回答
1139 浏览

c++ - CUDA中缓冲区的按位移位

有没有办法以按位方式在 CUDA 中存储缓冲区?例如,对于具有两个字节和一个指针的缓冲区

考虑到它们的位偏移,我想向左或向右移动位部分。就像是

对于上面的缓冲区,我希望:

打电话后

我在 CUDA 的文档或 Google 中找不到合适的功能。

请注意:我不感兴趣cudaMemcpy或正常memmove。我需要一个按位的 memmove !
我也知道如何使用普通 CPU 做到这一点,我需要一个更有效的替代方案,因此我正在考虑使用 CUDA。

0 投票
1 回答
280 浏览

c - free() 函数在几次 memmove 后导致崩溃

我正在编写一个函数,其作用类似于splicejs 中的函数:给定一个数组(任何类型),从给定索引开始删除一些元素,并在间隙中填充一些新元素(如果需要,扩展或缩小原始数组)。

我在 Windows7 下使用 MinGw/Eclipse CDT。这是我的代码:

我还写了一些测试代码,下面的代码片段是针对long long类型的:

它应该输出 7、111,233 和 377(从索引 1 中删除六个元素并将 111,233 和 377 填充到数组中)。

我测试了 char、int 和 long 类型数组,并且在所有情况下代码都有效。除了一个问题:我无法释放旧数组。似乎内存块被多次访问后就无法回收了memmove

如果我在 (1) 处将 malloc 更改为 realloc 并且 free() 不会崩溃,但我不能再使函数正常工作(而且我不确定 free() 函数是否真的工作)。

请就这个问题是如何出现的以及如何改进我的代码提供一些建议。