尽管平时千叮咛万嘱咐,可是低级错误总是不可避免的会在程序开发过程中出现:因此博主记录自己开发过程中出现过的错误,以便后期参考和总结:
1. 通过指针加下标访问数组
我自己写的一段代码,通过指针访问数组内容:
type struct T{
int score;
};
T A[3];
T *p = &A;
循环中通过加循环索引值 index(从0开始), p = p + index ;但每次取第三个结构体值时,总是取不到,
确认数组的值是存在的,因此肯定是访问的时候出了问题。
显然,第一次index的值为0,访问第一个结构体数组元素正确,p 指向A的第一个元素
第二次index的值为1,访问第二个结构体数组元素正确,p 指向A的第二个元素
第三次index的值为2,访问第三个结构体元素失败,p 指向未知区域,因为A只有三个元素!
解决办法:申明另外一个相同指针 p2,每次赋值为p + index ,而不是每次改变 p
2. 字符数组长度太小,造成程序崩溃
这次是调试守护进程的时候,调试大半天了,一直不知道原因出在哪儿,有以下几个特征:
(1)它在执行完一个子函数之后本地日志便再无更新(进程因为异常退出了)
(2)之前偶然出现过一次异常现象:字符串输出时打印出了未知符号,
CTO大神过来看了,三五分钟检查到有一个字符数组长度设太小,导致字符串溢出异常,
太小的原因是,输出的字符串是路径信息,导致总的字符过多,并且使用了sprintf,而非snprintf,
3. strncpy字符块拷贝,拷贝结果不完全
这也算是字符操作的陷阱之一,在拷贝流媒体数据时,比如视频流、音频流等数据,因为不可避免的碰到大量的'\0'字符,
所以当使用strncpy进行字符块拷贝时,一旦遇到'\0'字符,便会结束拷贝,解决的办法便是选用 memcpy,来执行拷贝。
4. linux环境下进行源程序的编译
(1)第一次编译后,可以成功运行。
(2)重新启动了下系统, 编译另外一个程序,执行时出现权限错误,查看文件属性,发现对当前用于没有可执行的权限
(3)用chmod a+x filename(当前目录)改变文件的可执行权限,再次执行,出现cannot execute binary file错误
(4)遂百度百度百度,找到了蛛丝马迹, 原来是编译的时候用错了格式,
正确的编译程序是 gcc sourcefile -o outputfile
我的错误格式: gcc -c sourcefile -o outputfile
5. 文件保存(针对视频流裸流解析,hik(海康) ipc(网络摄像头))
这个错误是我自己给自己挖的一个巨坑,拖着CTO解决了近一个星期,把自己都快整抑郁了,
这是在调试网络摄像头网RTMP服务器推流时,为了排除取流时出错的可能性,用写文件的方式把从海康摄像头里面剥离的h264数据保存成本地文件,
这个bug就出在这里,因为视频数据写入文件必须用二进制的方式来写,这样获得的h264数据才能正常播放, 而我根本没注意到这个问题的严重性,选择了初学者最常用的字符方式写入文件,导致h264文件无法正常用vlc播放器查看,但最坑爹的是,播放器解析出来的各项参数都是正确的,唯独视频画面像瀑布一样
6. libevent使用bug
在使用evhttp_add_header以及evbuffer_add_printf时,出现http请求体出现重复,出现此bug的代码:
evbuffer_add_printf(req->output_buffer, header.c_str());
evhttp_add_header(req->output_headers, "Host", evhttp_uri_get_host(uri)
);
更正后的代码为:
evbuffer_add_printf(req->output_buffer, header.c_str());
std::string tmp = evhttp_uri_get_host(uri);
evhttp_add_header(req->output_headers, "Host", tmp.c_str());