问题标签 [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.
c - 使用 memmove 代替 memcpy 的示例
区别:如果有重叠,使用memmove
代替memcpy
问:您能否提供任何 C lib 函数发生重叠的实际场景,因此使用 memmove 代替memcpy
?
c++ - memmove vs 向后复制
我知道memmove
在 C (cstring 库)中处理重叠很好“以较慢的运行时间为代价”(见这篇文章)。我想知道为什么这个额外的运行时成本?在我看来,任何重叠问题都可以通过向后而不是向前复制来解决,我错了吗?
作为一个玩具示例,这里有两个版本的“右移”函数,它将数组的内容向右移动一个元素:
它们是等价的吗?性能方面,哪一个最好用?
注意:从@DieterLücking 的评论来看,尽管采取了预防措施,但memmove
在这种情况下使用上述版本是不安全的。
c - 调用 memmove 或 memcpy 是否定义了 NULL?
我刚刚在我的设置(gcc 4.8.2,最近的 uClibc)上测试了以下内容,它运行良好:
它也适用于memcpy
. 所以很明显,将NULL
s 传递给这些函数在实践中可以正常工作,至少在某些设置上是这样。但我想进行防御性编码,并试图确定是否有任何 C 标准允许我依赖这种行为,或者它是未定义的还是实现定义的。
这个答案指出,C99 标准确实指定将 0 的大小传递给这些函数应该是有效的。这是第 7.21.1 节中的文本:
如果声明为 size_t n 的参数指定函数数组的长度,则 n 在调用该函数时可以具有零值。除非在本小节中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如 7.1.4 中所述。在这样的调用中,定位字符的函数找不到出现,比较两个字符序列的函数返回零,复制字符的函数复制零字符。
另一方面,阅读第 7.1.4 节似乎说NULL
未定义传递 s :
除非在随后的详细描述中另有明确说明,否则以下每个语句都适用: 如果函数的参数具有无效值(例如函数域之外的值,或程序地址空间之外的指针,或空指针,或指向不可修改存储的指针(当相应参数不是 const 限定时)或具有可变数量参数的函数不期望的类型(提升后),行为未定义。
这也是你的理解吗?任何人都可以确认/否认该标准是否未定义此行为吗?
我主要针对 C99,但也欢迎有关其他 C 标准的反馈。
c++ - /Does/ memmove 使用中间缓冲区吗?
这是一个出于好奇而不是任何重要的问题,但我只是想知道memmove
文档中的以下代码段:
复制就像使用了中间缓冲区一样发生
(强调我的)。该公式向我表明,是否使用中间缓冲区是特定于编译器实现的。
如果您要我写memmove
,我可能会自动执行以下操作:
n
在堆上分配字节memcpy
温度的来源memcpy
到目的地的温度- 释放缓冲区
我希望任何人都可以...
- ...确认该公式是否只是因为用户更容易可视化正在发生的事情,而没有解决特定实现实际上必须使用中间缓冲区的问题;
- ...阐明了一些常见 C++ 编译器(如或 Visual C++)中的实际
gcc
实现- 例如,它是否使用缓冲区并检查重叠是否可以memcpy
直接执行; - ...也许指出我上面的简单算法中明显的错误/效率低下。
c - 当我知道重叠面时,memmove() 替代方案是什么?
我想知道将 n 个字节从 *source 复制到 *destination、when
*destination = *source + k
和k is netural or zero
.
memcpy() 函数具有未定义的重叠行为。
memmove() 函数不是最好的,因为它必须检查重叠的一面。
还有另一个最适合我的功能吗?
提前致谢!
c++ - 如何检查是否已使用 C++ 分配器分配了部分内存?
有没有办法确定内存的特定部分是否包含在单个 C++ 分配的块中?不幸的是,在发布模式下。理想情况下在 Windows 和 Mac 上。
我这里有一个非常有问题的错误 - 它只出现在发布模式下,它非常难以模拟,多线程并且通常会破坏堆栈。它似乎是由调用 memmove 引起的,我唯一的猜测是它正在替换很大一部分内存,并且在访问冲突发生之前它通常已经替换了堆栈。
该算法非常复杂,并且不时发生这种情况,不知道如何有效地模拟它,所以我唯一的想法是将测试植入 memmove 以确保参数正确。当然,每个部分都应该位于一个分配器块中,所以我需要检查被替换的特定块是否正确。
arrays - 将数组从某个位置复制到c中的另一个数组
我有数组 A,我想将此数组从位置 x 复制到 y 到 C 语言中的另一个数组。请帮助在 c 中创建它。
使用 memcpy 仅从头开始复制数组。我想从特定位置复制到另一个位置。
c++ - CUDA中缓冲区的按位移位
有没有办法以按位方式在 CUDA 中存储缓冲区?例如,对于具有两个字节和一个指针的缓冲区
考虑到它们的位偏移,我想向左或向右移动位部分。就像是
对于上面的缓冲区,我希望:
打电话后
我在 CUDA 的文档或 Google 中找不到合适的功能。
请注意:我不感兴趣cudaMemcpy
或正常memmove
。我需要一个按位的 memmove !
我也知道如何使用普通 CPU 做到这一点,我需要一个更有效的替代方案,因此我正在考虑使用 CUDA。
c - free() 函数在几次 memmove 后导致崩溃
我正在编写一个函数,其作用类似于splice
js 中的函数:给定一个数组(任何类型),从给定索引开始删除一些元素,并在间隙中填充一些新元素(如果需要,扩展或缩小原始数组)。
我在 Windows7 下使用 MinGw/Eclipse CDT。这是我的代码:
我还写了一些测试代码,下面的代码片段是针对long long
类型的:
它应该输出 7、111,233 和 377(从索引 1 中删除六个元素并将 111,233 和 377 填充到数组中)。
我测试了 char、int 和 long 类型数组,并且在所有情况下代码都有效。除了一个问题:我无法释放旧数组。似乎内存块被多次访问后就无法回收了memmove
。
如果我在 (1) 处将 malloc 更改为 realloc 并且 free() 不会崩溃,但我不能再使函数正常工作(而且我不确定 free() 函数是否真的工作)。
请就这个问题是如何出现的以及如何改进我的代码提供一些建议。