WEB 开发 开发语言 Java 技术 .Net 技术 数 据 库 硬件使用
图象媒体 Linux/Unix 移动平台 嵌入开发 Windows 专区 软件工程
Ajax 技术 | ASP | PHP | ASP.NET | C# | JSP | Access | Oracle | 网页设计 | Flash | 安全专题 | IIS | VC/MFC | Delphi | C/C++
 你的位置:首页 > 开发语言 > C/C++

字符串free()问题,请教
[ 来源:ITWENKU 时间:2007-4-16 13:41:18 | 浏览:355人次 ]

#include <stdio.h>
#include <string.h>
#include<malloc.h>
void main()
{
char str[100] = "kall";
char * tstr;
tstr=(char *)malloc(strlen(str));
strcpy(tstr,str);
printf("%s\n",tstr);
//free(tstr); //free以\0结束释放
}
上述程序会正常输出,结果为:kall。不管malloc()的参数是strlen(str)还是strlen(str)+1,都能正常输出kall!

但是如果不注释掉free(tstr),并且malloc(strlen(str))时,运行时就会出debug error错误!

free()通过指针tstr已经知道要释放空间的类型和大小了,即char类型,strlen(str)个字节空间。那么为什么会出现上面的错误呢!



#include <stdio.h>
#include <string.h>
#include<malloc.h>
void main()
{
char str[100] = "kall";
char * tstr;
tstr=(char *)malloc(strlen(str)+1);
strcat(tstr, '\0');
strcpy(tstr,str);
printf("%s\n",tstr);
free(tstr); //free以\0结束释放
}



tstr=(char *)malloc(strlen(str));

===>>>

tstr=(char *)malloc(sizeof(str));



或者
strncpy(tstr,str,strlen(str));



上面的代码错了,用这个
#include <stdio.h>
#include <string.h>
#include<malloc.h>
void main()
{
char str[100] = "kall";
char * tstr;
tstr=(char *)malloc(strlen(str)+1);
memset(tstr, 0, strlen(str)+1);
strcpy(tstr,str);
printf("%s\n",tstr);
free(tstr); //free以\0结束释放
}


你的程序主要问题是这个函数:
strcpy(tstr,str);
这个函数会一直copy,str这个字串,知道'\0'终止,所以如果"kall"后一个地址的值不是'\0'就会拷贝更多的字符到tstr指向的内存连续地址。这样在释放的时候,系统发现要释放的内存大小与申请的不同,就会出错了
不知道这种理解对不对。
所以,在申请完内存后,要把这段内存都初始化为0


没问题吧,有问题也是出在这里
strcpy(tstr,str);
tstr的空间不够


我认为intuition444(直觉) 说出了问题所在


加个结尾符
#include <stdio.h>
#include <string.h>
#include<malloc.h>
void main()
{
char str[100] = "kall";
char * tstr;
tstr=(char *)malloc(strlen(str)+1);
strcpy(tstr,str);
tstr[strlen(str)] = '\0';
printf("%s\n",tstr);
free(tstr); //free以\0结束释放
}


 相关文章
·求多元函数极小值的算法?
·为什么我的vb6。0(SP6)没有自动参数信息功能?
·bioskey检测不到:Win键、右键菜单键、抓屏键、F11、F12键,请大家帮忙
·二维数组动态添加数据
·类与结构体混合使用
·怎样阻止程序访问栈中的内容?

 推荐文章
关于高精度乘法的问题
求助c用函数编程
一个关于32位系统的问题
关于堆栈的问题!!!!!
监视哨搜索算法问题
一个矩阵的问题
srting类型的参数传递的问题
请问有什么 c++ design pattern 方面的好书么?
怎样将Turbo C 2.0中的C程序拷贝到 WORD中啊
请说一下 get()函数有什么用.
C++ 中有没现成的函数 可以获得 鼠标所在的某个控件上的整个区域?
我想换个语言用请前辈给点意见
 版权所有:IT问库
copyright © 2006 www.itwenku.cn all rights reserved.