malloc上栽的跟头
来源:互联网 发布:it类专业有哪些 编辑:程序博客网 时间:2024/04/30 14:50
parse_sduid_str(uid_s, &src_uid, &des_uid);
int parse_sduid_str(const char *uid_s, char **src_uid, char **des_uid)
{
int i = 1;
int j = 0;
*src_uid = (char *)calloc(sizeof(char), 5);
*des_uid = (char *)calloc(sizeof(char), 5);
if(*src_uid == NULL || *des_uid == NULL){
return FALSE;
}
for(; uid_s[i] != ']'; i++, j++){
*src_uid[j] = uid_s[i];
}
*src_uid[j] = '\0';
for(i++, j = 0; uid_s[i] != '\0'; i++, j++){
*des_uid[j] = uid_s[i];
}
*des_uid[j] = '\0';
return TRUE;
}
这段代码有一个很严重的隐患问题:
calloc时候:
char **时候,形参已经获得实参地址(uid_s, &src_uid, &des_uid);
也就是说char *的地址是确定的,这时候把calloc返回的地址给了char * ,明明之中就会改变实参传过来的地址。例如实参是 1 2,calloc完毕之后 地址不见得是1 2而是calloc返回的地址可能是3,4也可能是其他。
应该是在函数内部定义变量之后calloc;一切操作完成之后再把首地址赋值给形参变量带回,这样就不会出问题。
设计问题:
1:
最好的函数设计只是实现要实现的功能不做其他任何处理!
也就是说malloc等等的内存管理函数都在主进程统一管理,维护。
函数内部只实现函数的事。否则很容易造成泄露也很不容易维护。
如果这个函数式循环调用的环境就是不好维护free的例子
2:
函数中能不malloc就不用,这写个内存函数会带来很多很多内存碎片。
这个是需要专门维护的,否则如果服务器一直运行不重启,内存总有吃空那时候。
3:设计:
int main()
{
char str[100] = {0};
func(str);
printf("%s\n", str);
}
int func(char *buf){
strcpy(buf, "1234");
}
- malloc上栽的跟头
- 我在串口的偶校验竟然栽了跟头
- 爱迪生的致命大跟头
- 在自己最自信的地方栽了大跟头,惨不忍睹!
- 刚栽了两个跟头,大家吸取教训啊......
- malloc函数(百度上找的)
- 载了俩跟头
- malloc、calloc、realloc在分配内存上的区别
- linux 下 C 编程和make的方法 ( 九、malloc 和free的使用 上)
- linux 下 C 编程和make的方法 ( 九、malloc 和free的使用 上)
- Windows系统上的VirtualAlloc, HeapAlloc和malloc,new的区别
- Debug一上午没研究出来的程序,索定在malloc上~
- TCMalloc:线程缓存的Malloc(特指用在游戏服务器上)
- "粗暴"让马云栽了个大跟头
- 奇怪的malloc问题!
- 对Malloc的疑惑!
- malloc(0)的问题
- malloc 的用法
- magento添加调用block的几种方法
- C++ 运算符优先级列表
- Java Swing界面编程(7)---JButton设置图片
- 什么是java序列化,如何实现java序列化?
- Gdb list使用介绍
- malloc上栽的跟头
- input宽度自适应
- ISA Server 2006企业版与标准版区别及阵列布署
- C#0003--如何使用树状视图控件
- 超市通:分析中心的销售数据与卖场中心的不一致,怎么回事?
- 【Java并发编程】之二十:并发新特性—Lock锁和条件变量(含代码)
- 创建自定义异常类
- jQuery判断单选框是否被选中
- Unable to start activity ComponentInfo 解决方法