| 字符串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结束释放 }
|
|
 |
推荐文章 |
|