程序里面经常会用到char*指针来缓存数据,在这里遇到了很多莫名其妙的问题,最后摸索总结了一套指针的可靠用法。
以前都是这么用的:
char *send_data;
sprintf(send_data,"%s","test");
问题有两个,第一是只给了指针,没有指针初始化,指针是悬空的,也叫野指针,下面到指针指向的位置数据,打到哪里就看运气了,会不会出现致命的错误也要看运气了。
第二个问题,sprintf本身就不安全,因为这个函数本身是多参数的,也就是说,不管send_data是多长多大,它只管把格式化的字符串放进来,很可能会溢出的。推荐安全的用法是snprintf,增加了参数size。
正确的用法应该是这样的:
char *send_data=NULL;//初始化的时候就指向NULL,以防悬空指针导致错误
send_data=(char*)malloc(1024);//在堆中分配空间并将指针地址传给指针变量
snprintf(send_data,strlen("test"),"%s","test"); //定长输出到字符串变量(这里只是实例一下)
free(send_data); //看到很多地方写if(send_data) free(send_data);我觉得没必要,反正NULL可以多次free也不会出问题
send_data=NULL;//重新指向NULL,除了防止出现野指针外,还能防止重复free导致复位(不能对同一区域两次free)
网友评论