memcpy函数

内核栈回溯原理学习应用

独自空忆成欢 提交于 2020-04-08 08:45:36
  这篇主要是杭州操作系统大会前辈的文档进行学习,因为文档公开了故而总结学习一下,如若其中有侵权的地方,请及时联系我,谢谢 ........................................................................................................................................................................................................................... 问题:     一台客户现场机器,运行一周左右偶然发生一次应用段错误或者double free问题,cpu可能是arm、mips、x86等架构,有什么好的方法捕捉异常日志? 困难点:   1. 研发环境常使用gdb+coredump技术解决此类问题,客户现场等非研发环境的偶现应用异常问题,不方便使用,操作起来有一定难度   2. 不同架构(arm32、arm64、mips、x86),不同版本C库和gdb,栈回溯效果差异很大。PC ubuntu系统测试,glibc 2.15,发生应用double free,直接打印栈回溯信息,其他架构的CPU上测试没有这个功能。arm64架构的某款CPU上测试

【视频开发】ONVIF、RTSP/RTP、FFMPEG的开发实录

笑着哭i 提交于 2020-03-29 14:01:59
ONVIF、RTSP/RTP、FFMPEG的开发实录 前言 本文从零基础一步步实现ONVIF协议、RTSP/RTP协议获取IPC实时视频流、FFMPEG解码。开发环境为WIN7 32位 + VS2010。 最终成功获取浩云、海康、大华的IPC实时视频流。 如果要了解本文更多细节,或者用本文作设计指导,那最好把文中提到的连接都打开,与本文对照着看。 前期准备 1.准备一个ONVIF服务器 既然开发的是客户端,那必需要有服务端了。我这里大把的IPC,好几个品牌的,就随便拿了一个。 如果没有IPC,倒是可以用 VLC media player 搭建一下。或者其他播放器也可以。这个网上很多资料。 2.准备一个ONVIF 测试工具 这个工具在ONVIF的官网上可以找到:ONVIF Device Test Tool 。 3.准备解码器相关资料及资源 收到视频流后,需要解码。可以用ffmpeg,也可以用其他解码库。这个是后话了,等ONVIF搞定之后再搞解码也不迟。推荐链接: http://wenku.baidu.com/view/f8c94355c281e53a5802ffe4.html?re=view (Windows下使用MinGW编译ffmpeg与x265) 4.准备资料 ONVIF协议书必看,ONVIF官网自然是不能少的。其他资料推荐几个链接: http://www.cuplayer

C语言 malloc()、memcpy()、free()等

▼魔方 西西 提交于 2020-03-10 08:54:06
1、malloc()函数: void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。) 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针, 否则返回空指针NULL。 当内存不再使用时,应使用 free() 函数将内存块释放。 malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的,申请的内存是连续的 。 返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。 malloc 函数返回的是 void * 类型,C++:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。 所以必须通过 (int *) 来将强制转换 。 C是能通过编译,不会报错。 规范的程序: (检查返回值是否不是NULL,不检查若申请分配失败便造成 内存泄漏 ) type *p; if(NULL == (p = (type*)malloc(sizeof(type)))) /*请使用if来判断,这是有必要的*/

WinCE平台下BMP转JPG代码备份3

安稳与你 提交于 2020-02-17 14:30:15
1 //带参数的保存位图函数 2 BOOL FileOperate::bmpSaveImage(PTSTR pstrFileName, BITMAPFILEHEADER *pbmfh) 3 { 4 BOOL bSuccess ; 5 DWORD dwBytesWritten ; 6 HANDLE hFile; 7 8 hFile = CreateFile ( pstrFileName, GENERIC_WRITE, 0, NULL, 9 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ; 10 11 if (hFile == INVALID_HANDLE_VALUE) { 12 return FALSE ; 13 } 14 15 bSuccess = WriteFile (hFile, pbmfh, pbmfh->bfSize, &dwBytesWritten, NULL); 16 17 CloseHandle (hFile) ; 18 19 if (!bSuccess || (dwBytesWritten != pbmfh->bfSize)) { 20 DeleteFile (pstrFileName) ; 21 return FALSE ; 22 } 23 return TRUE ; 24 } 25 26 //**************

模拟实现memcpy

倾然丶 夕夏残阳落幕 提交于 2020-02-07 06:55:05
模拟实现my_memcpy函数 # include <stdio.h> # include <stdlib.h> # include <assert.h> //assert函数的头文件 //size_t 无符号整型(unsigned) 数字必须>0 void * my_memcpy ( void * str , const void * dst , size_t num ) { //void* str 传入要被赋值的数组的地址 //void* dst 传入被复制的数组的地址 assert ( str && dst ) ; //保证不为空指针 int * str_str = ( int * ) str ; //将任意数据类型强转成需要的类型 int * str_dst = ( int * ) dst ; //关键看给的是什么类型 for ( int i = 0 ; i < num ; ++ i ) { str_str [ i ] = str_dst [ i ] ; //进行逐个copy } return dst ; //返回指针类型 } int main ( ) { int dst [ 4 ] = { 1 , 1 , 2 , 3 } ; int str [ 4 ] ; my_memcpy ( str , dst , 4 ) ; 调用my_memcpy函数 system (

C/C++ memcpy(常用函数一)

不羁的心 提交于 2020-01-20 02:48:21
memcpy C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字符到存储区 str1。 str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。 str2 – 指向要复制的数据源,类型强制转换为 void* 指针。 n – 要被复制的字节数。 来源: CSDN 作者: alangaixiaoxiao 链接: https://blog.csdn.net/alangaixiaoxiao/article/details/104043355

Linux字符串函数集

戏子无情 提交于 2020-01-11 22:31:51
//Linux字符串函数集: 头文件:string.h   函数名: strstr   函数原型: extern char *strstr( char *str1, char *str2);   功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。   返回值:返回该位置的指针,如找不到,返回空指针。 包含文件:string.h   函数名: strstr   函数原型:extern char *strstr(char *str1, char *str2);   功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。   返回值:返回该位置的指针,如找不到,返回空指针。 原型: extern char *strchr( const char *s, char c);    const char *strchr( const char* _Str, int _Val)    char *strchr( char* _Str, int _Ch)   头文件:#include <string.h>   功能:查找字符串s中首次出现字符c的位置   说明:返回首次出现c的位置的指针,如果s中不存在c则返回NULL。   返回值:Returns the address of the first occurrence of

一些常用函数:memset、memcpy、strlen、strcpy

风格不统一 提交于 2020-01-06 14:48:39
memset一般用作初始化函数。作用是将某一块内存中的内容全部设置为某一值。 格式:起始指针、设定的初始值、长度 memset ( buffer , 0 , sizeof ( int ) * 10 ) ; //在buffer处初始化10个0 memcpy用于从源内存地址的起始位置开始拷贝若干个字节到目标内存地址。 格式:返回指针,源指针、长度 memcpy ( dst , src , strlen ( src ) + 1 ) ; strlen是计算字符串长度的函数,从内存任意位置开始到’\0’为止的字符数量,一般比sizeof得到的少1。 格式:字符串指针 strlen ( str ) ; strcpy是字符串拷贝函数,把含有’\0’结束符的字符串复制到另一个地址空间。 格式:返回指针,源指针 strcpy ( dst , src ) ; 来源: CSDN 作者: 海洋之心。 链接: https://blog.csdn.net/weixin_42979679/article/details/103846996

c memmove和memcpy的实现和区别

微笑、不失礼 提交于 2019-12-14 23:38:55
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count); 他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。 第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。 第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。 实际上,memcpy只是memmove的一个子集。 二者的c语言实现很简单,有兴趣的朋友可以去看看。在实际情况下,这两个函数都是用汇编实现的。 memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些,如: char s[] = "1234567890"; char* p1 = s; char* p2 = s+2;

memcpy和memmove使用区别

余生长醉 提交于 2019-12-09 15:11:13
memcpy函数原型 void * memcpy ( void * dest , const void * src , size_t n ) ; man手册描述:memcpy()函数从内存区域src复制n个字节到内存区域dest。内存区域不能重叠。如果内存区域重复使用memmove memcpy实现 void * memcpy ( void * dest , const void * src , size_t n ) { char * dp = dest ; const char * sp = src ; while ( n -- ) * dp ++ = * sp ++ ; return dest ; } memmove函数原型 void * memmove ( void * dest , const void * src , size_t n ) ; man手册描述:memmove()函数将n个字节从内存区域src复制到内存区域dest 首先将字节复制到不重叠的src或dest的临时数组中,然后将这些字节从临时数组复制到dest。 memmove实现 ```handlebars void * memmove ( void * dest , const void * src , size_t n ) { unsigned char tmp [ n ] ; memcpy ( tmp