memcpy()和之间有什么重大区别strncpy()?我问这个是因为我们可以轻松地改变strncpy()以复制我们想要的任何类型的数据,而不仅仅是字符,只需将前两个非char*参数转换char*为第三个参数,并将第三个参数更改为非char类型的大小的倍数.在下面的程序中,我已经成功地使用它来将整数数组的一部分复制到其他程序中,并且它的效果一样好memcpy().
#include <stdio.h>
#include <string.h>
int main ()
{
int arr[2]={20,30},brr[2]={33,44};
//memcpy(arr,brr,sizeof(int)*1);
strncpy((char*)arr,(char*)brr,sizeof(int)*1);
printf("%d,%d",arr[0],arr[1]);
}
Run Code Online (Sandbox Code Playgroud)
同样,我们可以使其适用于float其他数据类型.那么有什么重大区别memcpy()呢?
PS:另外,我想知道为什么memcpy()在string.h头文件中,几乎所有的库函数都与字符串有关,而memcpy()在本质上更通用.任何原因?
采取以下代码
#include <iostream>
void func() {
int i = 2147483640;
while (i < i + 1)
{
std::cerr << i << '\n';
++i;
}
return;
}
int main() {
func();
}
Run Code Online (Sandbox Code Playgroud)
这段代码显然是错误的,因为while循环仅在有符号的int i溢出(即UB)时才能终止,因此编译器可以例如将其优化为无限循环(Clang在上进行-O3)或执行其他类型的时髦操作。现在我的问题是:从我对C ++标准的阅读中,等同于签名的类型可能会别名(即指针int*和unsigned*别名)。为了进行一些时髦的签名“包装”,以下内容是否具有未定义的行为?
#include <iostream>
static int safe_inc(int a)
{
++reinterpret_cast<unsigned&>(a);
return a;
}
void func() {
int i = 2147483640;
while (i < safe_inc(i))
{
std::cerr << i << '\n';
++i;
}
return;
}
int main() {
func(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个memcpy函数,它不会将源内存加载到cpu缓存中.目的是避免缓存污染.下面的memcpy函数可以工作,但是像标准的memcpy那样污染了缓存.我正在使用P8700 proccesoor与visual C++ 2008 express.我看到了intel vtune的cpu缓存使用情况.
void memcpy(char *dst,char*src,unsigned size){
char *dst_end=dst+size;
while(dst!=dst_end){
__m128i res = _mm_stream_load_si128((__m128i *)src);
*((__m128i *)dst)=res;
src+=16;
dst+=16;
}
}
Run Code Online (Sandbox Code Playgroud)
我有另一个版本,具有相同的结果 - 工作,但污染缓存.
void memcpy(char *dst,char*src,unsigned size){
char *dst_end = dst+size;
__asm{
mov edi, dst
mov edx, dst_end
mov esi,src
inner_start:
LFENCE
MOVNTDQA xmm0, [esi ]
MOVNTDQA xmm1, [esi+16]
MOVNTDQA xmm2, [esi+32]
MOVNTDQA xmm3, [esi+48]
//19. ; Copy data to buffer
MOVDQA [edi], xmm0
MOVDQA [edi+16], xmm1
MOVDQA [edi+32], xmm2
MOVDQA [edi+48], xmm3
// 25. ; …Run Code Online (Sandbox Code Playgroud) 我很困惑如何使用memcpy读取数组中复制的指针.以下是我尝试过的,但不起作用.
基本上,我已经分配了内存块,我在其中复制类似于数组时尚的指针,但在重试期间它无法正常工作.虽然这适用于基本数据类型
我想在element块中存储任何东西,它可以是integers或者pointers.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INDEX(x) ((char *)elements + (sizeof(int*) * (x)))
int size = 10;
void f2_int_ptr() {
int i = 0;
void *elements = (void*)malloc(size * sizeof(int*));
for ( i = 0; i < size; i++ ) {
int *v = ( int *) malloc ( sizeof(int));
memcpy ( v, &i, sizeof ( int ));
memcpy ( INDEX(i) , v, sizeof (int*));
}
for ( i = …Run Code Online (Sandbox Code Playgroud) 我目前正在使用GCC 4.5.3,为PowerPC 440编译,并且正在编译一些不需要libc的代码.我没有直接调用memcpy(),但编译器似乎在构建期间插入一个.
有一些链接器选项,如-nostdlib,-nostartfiles,-nodefaultlibs但我无法使用它们,因为我没有进行链接阶段.我只是在编译.有这样的事情:
$ powerpc-440-eabi-gcc -O2 -g -c -o output.o input.c
Run Code Online (Sandbox Code Playgroud)
如果我用nm检查output.o,我会看到对memcpy的引用:
$ powerpc-440-eabi-nm output.o | grep memcpy
U memcpy
$
Run Code Online (Sandbox Code Playgroud)
GCC手册页明确了如何使用链接器删除对memcpy和其他libc调用的调用,但我不希望编译器首先插入它们,因为我使用的是完全不同的链接器(不是GNU的ld) ,它不知道libc).
感谢您的任何帮助,您可以提供.
请考虑以下代码:
float float_value = x; // x is any valid float value
int int_value = 0;
size_t size = sizeof(int) < sizeof(float) ? sizeof(int) : sizeof(float);
memcpy(&int_value, &float_value, size);
Run Code Online (Sandbox Code Playgroud)
据我所知,这可能导致陷阱表示.我的问题:
如何在C中记忆二维数组:
我有一个二维数组:
int a[100][100];
int c[10][10];
Run Code Online (Sandbox Code Playgroud)
我想使用memcpy将数组c中的所有值复制到数组a,如何使用memcpy执行此操作?
int i;
for(i = 0; i<10; i++)
{
memcpy(&a[i][10], c, sizeof(c));
}
Run Code Online (Sandbox Code Playgroud)
它是否正确?
我正在寻找memcpy.c的实现,我发现了一个不同的memcpy代码.我无法理解他们为什么这样做(((地址)s)|((ADDRESS)d)| c)&(sizeof(UINT) - 1)
#if !defined(__MACHDEP_MEMFUNC)
#ifdef _MSC_VER
#pragma function(memcpy)
#undef __MEMFUNC_ARE_INLINED
#endif
#if !defined(__MEMFUNC_ARE_INLINED)
/* Copy C bytes from S to D.
* Only works if non-overlapping, or if D < S.
*/
EXTERN_C void * __cdecl memcpy(void *d, const void *s, size_t c)
{
if ((((ADDRESS) s) | ((ADDRESS) d) | c) & (sizeof(UINT) - 1)) {
BYTE *pS = (BYTE *) s;
BYTE *pD = (BYTE *) d;
BYTE *pE = (BYTE *) (((ADDRESS) s) + c); …Run Code Online (Sandbox Code Playgroud) 我有std :: string变量.我需要从无符号字符数组中加入一些字节.我知道第一个字节和第一个字节.
我可以使用std :: string :: assign函数.我做到了
但我想使用memcpy函数以正确的方式解决该问题.
std::string newString;
memcpy(&newString, &bytes[startIndex], length);
Run Code Online (Sandbox Code Playgroud)
我知道这是错的.我已经使用std :: vector研究并发现了一些想法.
请帮我找到这个问题最优雅的解决方案.