C/C++
文章平均质量分 51
MCNS_37
这个作者很懒,什么都没留下…
展开
-
记录一次C++使用system函数运行cmd的小bug
C++/python 中的system函数原创 2022-08-13 16:12:47 · 921 阅读 · 0 评论 -
记一次printf导致的异常内存操作bug
printf引发的内存操作问题 本来很简单的UDP通信程序,移植到嵌入式板子中运行,却发现在进行发送时,目的ip地址莫名其妙的被清空了,一开始还怀疑是板子里缺少库,后来又将程序中关于UDP的代码粘了出来单独搞了个UDP测试程序,发现没问题,能够正常通信。 在百思不得解的时候,发现两段代码里只是差了一个printf,立马检查该条语句,结果发现,在指定printf输出格式时,有一个应该是整形,结果被我强制输出成了浮点型,就导致了内存的异常操作,以至于目的地址被异常清空,错误代码如下:...原创 2021-11-16 15:58:46 · 1974 阅读 · 0 评论 -
C 多线程捕获段错误
C 多线程捕获段错误原创 2021-07-28 16:32:29 · 297 阅读 · 0 评论 -
#pragma pack() 易忽略的问题
#pragma pack() 易忽略的问题 C/C++中,class、struct、union默认的大小对齐方式为按照成员变量所占空间最大的大小进行对齐,如:typedef struct test{ char a; int b; double c;}test_t; 则test结构体内所有成员变量按照double类型进行字节对齐,此时sizeof(test_t)等于8*3。在网络通信中,为了让数据包更紧凑些,我们往往希望能够通过#pragma pack预编译命令改变默认对原创 2021-06-28 11:12:41 · 577 阅读 · 0 评论 -
C 字符串替换
C 字符串替换 C语言没有提供写好的字符串替换函数,需要结合字符串查找、字符串拷贝以及字符串拼接等函数自行编写,示例代码如下:// 将strRes中的from替换为to,替换成功返回1,否则返回0。int StrReplace(char strRes[],char from[], char to[]) { int i,flag = 0; char *p,*q,*ts; for(i = 0; strRes[i]; ++i) { if(strRes[i原创 2021-06-22 10:39:15 · 2408 阅读 · 0 评论 -
C 记录编译时间、日期
C 记录编译时间及日期 近日做嵌入式开发时,需要记录软件版本,所以希望能够获取到当前程序的编译时间及日期,经查询,ANSIC标准已定义了可供C语言使用的预定义宏,其中包括: 1、__ LINE__ : 在源代码中插入当前源代码行号。 2、__ FILE __ : 在源代码中插入当前源代码文件名。 3、__ DATE __ : 在源代码中插入当前编译日期〔注意和当前系统日期区别开来〕 4、__ TIME __ : 在源代码中插入当前编译时间〔注意和当前系统时间区别开来〕 标识符__LINE__和原创 2021-06-22 10:32:32 · 1574 阅读 · 0 评论 -
asn1c编解码函数引发的段错误
asn1c编解码函数引发的段错误Encode函数uper_encode_to_new_buffer(&asn_DEF_MessageFrame, 0,msgFrame, (void**)&chbuf); 对于Encode函数,主要在于msgFrame编码后的地址空间会直接给到存放编码的buf,所以不需要对buf进行单独的申请以及释放,不然会报段错误,详细参见我之前的博客段错误(核心已转储)——那些易被忽略的细节Decode函数uper_decode(opt_codec_ctx,原创 2021-05-20 22:57:36 · 1164 阅读 · 0 评论 -
x,y直角坐标系转经纬度WGS-84坐标系
x,y直角坐标系转经纬度WGS-84坐标系 坐标系的转换采用了白塞尔大地主题反算算法,需要指明x,y坐标系的中心点所对应的现实世界的经纬度,代码如下://获取方位角double getAngle(double x, double y) { double angleTemp; if (x == 0 && y > 0) //y轴正向 { angleTemp = 0; } if (y >= 0 && x > 0) //第一象限及x轴正向原创 2021-05-14 09:34:08 · 4702 阅读 · 4 评论 -
段错误(核心已转储)——那些易被忽略的细节
段错误(核心已转储)——那些易被忽略的细节 段错误,就是一旦一个程序发生了越界访问,cpu 就会产生相应的保护,于是 segmentation fault 就出现了,通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏。更多关于段错误的介绍可参照C语言再学习 – 段错误(核心已转储)。 对于段错误,常伴随着“free():invaild pointer”或者"double free or corruption"等,目前我遇到原创 2021-05-11 23:34:27 · 1681 阅读 · 2 评论 -
C 多线程互斥锁pthead_mutex_t
C 多线程互斥锁pthead_mutex_t 进行C多线程开发时,需要调用<pthread.h>中的相关变量定义以及函数,对于新建一个线程无外乎下面几个步骤: 1、定义线程函数; 2、定义线程标识符pthread_t; 3、通过pthread_create函数创建线程; 4、调用pthread_join阻塞进程使得线程中函数完全运行(可选)#include <pthread.h>void* testPthread(void* arg){ printf("Hell原创 2021-05-01 14:54:22 · 249 阅读 · 0 评论 -
C sprintf 拷贝异常
C sprintf 拷贝异常 对于非安全的sprintf字符串拷贝函数,有时会发现,拷贝后的目的字符串输出后末尾会有乱码,或者目的字符串并没有得到想要的值,且源字符串的值也被改变了。 其实根本原因在于:1、对于字符串,系统需要获得该字符串的终止符,也就是需要知道该字符串的终止位置,若源字符串和目的字符串大小一致,则会出现上述问题,最保险的方法应该是为目的字符串申请至少大于源字符长度1个字节的空间;2、由于sprintf中间的format参数,会默认源字符串具有该指定类型的长度,如果为其申请的目的字符原创 2021-04-30 23:45:23 · 565 阅读 · 1 评论 -
Linux C 内存管理-实例分析
Linux C 内存管理-实例分析 Linux C 内存管理其实可以总结成一句话:管理你该管理的。即由系统静态分配的内存不要去释放,系统会在变量生命期结束时自动释放内存,而自己动态分配的内存则需要主动释放,同时要注意,同一块内存不要释放两次,更多具体关于Linux 内存管理的介绍可参考Linux内存管理以及段错误(核心已转储)。接下来通过一个实例来讲述下内存管理的过程。 给定了一个字符串指针,并为其分配了一定的地址空间,如下所示:#include<stdlib.h>#include&l原创 2021-04-29 21:21:29 · 161 阅读 · 0 评论 -
C 函数返回字符串
C 函数返回字符串 在讨论几种函数返回字符串方法之前,首先要对函数有一个简单的认识,无论是在形实结合时,还是在return语句返回时,都有一个拷贝的过程。你传进来的参数是个值,自然函数在工作之前要把这个值拷贝一份供自己使用,你传进来的是个地址,函数也就会拷贝该地址供自己使用。同样return返回时,如果返回一个值,函数会将该值拷贝一份以提供给主调函数使用,返回的是一个指针(也就是地址),自然拷贝的就是一个地址,供主调函数使用。 下面给出一个错误的例子:#include <stdio.h>原创 2021-04-28 20:42:56 · 370 阅读 · 0 评论 -
利用asn1c 工具填充CASE消息集-BSM
利用asn1c 工具填充CASE消息集-BSM 利用asn1c工具填充BSM消息可简单总结如下: 1、使用asn1c工具将asn.1源文件解析成*.h和*.c文件。 2、新建test.c,包含上一步生成的"MessageFrame.h",填充BSM消息集,最后编码。代码如下:#include "MessageFrame.h"#include <sys/time.h>#include <time.h>void BSMEncode(){ int current原创 2021-04-27 20:09:46 · 1181 阅读 · 10 评论 -
Linux 获取毫秒级时间戳
Linux 获取毫秒级时间戳 在Linux中获取ms级别的时间戳,需要结合gettimeofday()以及localtime()函数。如下所示:#include <time.h>#include <sys/time.h>/* 日志时间戳,精确到毫秒 */char* get_stime(void){ static char timestr[200] ={0}; struct tm * pTempTm; struct timeval time;原创 2021-04-27 00:10:48 · 10901 阅读 · 0 评论 -
C 函数引用参数传递Error——存在正文时不允许未命名的原型参数
C 函数引用参数传递error问题描述: 在test.c中,定义函数并为函数传引用参数,代码如下:void test(int& a){ //.... a = 666;} 结果在定义时IDE便提示error: 1、请输入")" C/C++(18) 2、存在正文时不允许未命名的原型参数 C/C++(141) 原因分析: .c文件为纯C语言,不支持引用。解决方案: 1、将*.c文件重命名为*.cpp文件。 2、将引用传参改为指针传参,即:void test(i原创 2021-04-27 19:29:02 · 16357 阅读 · 5 评论 -
C 运算符优先级——位运算符和逻辑运算符
C 运算符优先级——位运算符和逻辑运算符 在进行C语言开发时,若单条表达式用到的运算符过多,需要注意运算符的优先级,否则无法得到欲得到的结果,最显而易见的便是“先算乘除,后算加减”。 说说我遇到的问题吧:在if中判断某一个字符&0x80后是否等于0,一开始我是这么写的:if (data & 0x80 == 0) { //code ...} 结果发现明明字符data最高位为0,但依然无法进入if语句块,而单独输出data & 0x80时,其输出结果为0,于是猜想可原创 2021-04-26 23:44:06 · 7290 阅读 · 2 评论 -
C/C++结构体大小问题
C/C++结构体大小问题 自定义的结构体大小与其内所定义的成员变量以及所采用的对齐方式有关。在进行网络编程时,若用结构体进行接收或者发送,则接发两端所定义的结构体大小必须一致,若跨系统编程,还要注意同一数据类型可能在不同系统下的大小也不同,如下表所示: 所以跨系统编程时,应尽量避免使用long类型,或者对其进行特殊处理。 当未指定对齐方式时,默认会按照结构体内长度最大的成员变量进行对齐,如下图示例:(操作系统为32位) 可以通过指定对齐方式的方法来改变结构体的对齐方式,在C/C++中通过.原创 2021-03-29 10:33:48 · 570 阅读 · 0 评论 -
C++ string字符串分割
C++ string字符串分割一、find()配合substr()二、使用strtok()函数总结一、find()配合substr() 第一种办法是先通过find()函数查询到子字符串的位置,而后通过substr进行子字符串截取。 关于find()函数共有以下几种: 1.string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返.原创 2021-02-04 15:30:26 · 13860 阅读 · 0 评论 -
C++ MYSQL连接及操作
C++ 连接MYSQL及执行SQL语句前言一、下载MYSQL二、安装VS2015三、MYSQL操作1.配置环境2.连接MYSQL3.MYSQL操作总结前言 编译环境为VS2015 + MYSQL5.7(或者以上)一、下载MYSQL 这里注意安装的是MYSQL-Community-Server-Version,去MYSQL官网下载即可,现在最新的应该是8.0.23,我之前用的都是5.7的,不过不原创 2021-02-04 13:04:05 · 499 阅读 · 0 评论 -
ubuntu下无法找到mysql.h
编译环境: Ubuntu Linux下C连接MYSQL问题描述: ubuntu通过sudo apt-get install mysql-server-version 安装mysql后,C编译连接MYSQL无法找到mysql.h,报以下错误: fatal error: mysql.h: No such file or directory原因分析: mysql.h在ubuntu下默认安装在/user/include/mysql/mysql.h,所以直接#include<mysql.原创 2021-03-08 16:31:43 · 3972 阅读 · 2 评论 -
C-V2X 网络层及适配层解析填充
网络层及适配层解析填充一、适配层二、网络层(DSMP)备注一、适配层 适配层提供底层接入技术与上层协议栈之间的传输适配功能。其中,适配层接收上层发送的DSMP 数据包、IP 数据包或DME 数据包,区分待发送数据包所使用的底层接入技术,并将相应数据包递交到符合对应接入技术的底层进行传输;或接收来自底层的数据包,区分相应数据包所属的上层协议类型,并将数据包递交给指定的上层协议栈。 合作式智能运输系统专用短程通信网络层业务需支持无连接无确认的LLC 操作、子网接入协议和IP 数据报传输协议。 .原创 2021-03-22 21:23:39 · 4396 阅读 · 12 评论 -
C++ List遍历异常
问题描述: 在两个线程中,线程1通过UDP接收数据动态的向LIst中添加数据,线程2实时动态遍历List中的数据,发现虽然在线程1中所有的数据均已添至List中,但是线程2中却无法成功遍历List中所有的数据,代码如下:void *pthread1(void *arg) { WORD sockVersion = MAKEWORD(2, 2); WSADATA wsadata; if (WSAStartup(sockVersion, &wsadata) != 0) { cout &l原创 2021-03-23 23:06:07 · 668 阅读 · 0 评论