动态给char* 分配了空间如何去释放

swallowfyx 2009-09-11 02:08:43
void leftcut(char *dst,char *src, short n)
{

int len = strlen(src);

if(n>len) n = len;

int i = 0 ;
while(n--)
{
dst[i] = src[i];
i++;
}
dst[i]='\0';

}


前几天在做一个程序的时候用到了要截取char*类型字符串左边部分的功能。在网上看到了这样的一个算法。
用了确实有效。但是用来存放dst的空间是动态分配的。

比如:

int num = 10 ;
char * dst = (char *)malloc(sizeof(char)*num);
leftcut(dst,src,5);
cout<<dst<<endl;
free(dst);

当用完了dst之后对其进行释放。但是总会出错。原因尚不清楚。
以前是对它直接赋值就没法释放,后来搞清楚了。用strcpy去赋值就没问题了。
这次作为参数传递给函数调用之后又没办法释放了。
这个要怎么改呢。

此函数原型:(存在同样的问题)
char * left(char *dst,char *src, int n)
{
char *p = src;
char *q = dst;
int len = strlen(src);
if(n>len) n = len;
/*p += (len-n);*/ /*从右边第n个字符开始*/
while(n--) *(q++) = *(p++);
*(q++)='\0'; /*有必要吗?很有必要*/
return dst;
}



...全文
590 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
swallowfyx 2009-09-11
  • 打赏
  • 举报
回复
呵呵 谢谢 上面各位的指点了。
问题得到了解决。

我把原先的方法改写了。
void leftcut(char *dst,char *src, short n)
{

int len = strlen(src);

if(n>len) n = len;

int i = 0 ;
while(n--)
{
dst[i] = src[i];
i++;
}
dst[i]='\0';

}

这样直接指针加减,得到的结果实际上指针的指向已经改变了。
还是用那函数原型来做不会出问题。
我之所以用原型也出问题是因为程序里申请的空间弄错了。申请的不够大。
现在
free成功了。呵呵。
char * left(char *dst,char *src, int n)
{
char *p = src;
char *q = dst;
int len = strlen(src);
if(n>len) n = len;
/*p += (len-n);*/ /*从右边第n个字符开始*/
while(n--) *(q++) = *(p++);
*(q++)='\0'; /*有必要吗?很有必要*/
return dst;
}

这个是正确的,没问题的。
kasa_2008 2009-09-11
  • 打赏
  • 举报
回复
其实楼主可以跟踪一下代码,看看堆栈的情况就知道了
云梦谭 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 swallowfyx 的回复:]
strncpy 和 memset 这些也都去做过。

程序做测试的时候就是申请多大的空间就拿多大的串去赋值的。

就是一到释放内存的地方就错了。
[/Quote]
申请多大的空间就拿多大的串去赋值的,那结束符的位置就越界了。分配时长度加1
kasa_2008 2009-09-11
  • 打赏
  • 举报
回复
void leftcut(char *dst,char *src, short n)
这里面并不是申请多长就拷贝多长的,而是都拷贝了

应该是释放时数组越界的原因。
w0911h 2009-09-11
  • 打赏
  • 举报
回复
这个是什么意思,申请多大就拷贝多长?那样的话最后一个'\0'放哪
[Quote=引用 12 楼 swallowfyx 的回复:]
strncpy 和 memset 这些也都去做过。

程序做测试的时候就是申请多大的空间就拿多大的串去赋值的。

就是一到释放内存的地方就错了。
[/Quote]
swallowfyx 2009-09-11
  • 打赏
  • 举报
回复
是用c的函数写主要功能。呵呵。cout用着习惯了。反正现在C++也兼容C了就没去区分。
swallowfyx 2009-09-11
  • 打赏
  • 举报
回复
strncpy 和 memset 这些也都去做过。

程序做测试的时候就是申请多大的空间就拿多大的串去赋值的。

就是一到释放内存的地方就错了。
jiayucunyan 2009-09-11
  • 打赏
  • 举报
回复
lz到底写的是C还是C++啊

怎么又是cout,又是malloc呢??


#include <stdio.h>
#include <string.h>
#include <stdlib.h>


char * left(char *dst,char *src, int n)
{
char *p = src;
char *q = dst;
int len = strlen(src);
if(n>len) n = len;
/*p += (len-n);*/ /*从右边第n个字符开始*/
while(n--) *(q++) = *(p++);
*(q++)='\0'; /*有必要吗?很有必要*/
return dst;
}

int main(void)
{
int num = 10 ;
char *src = "hello world!";
char * dst = (char *)malloc(sizeof(char)*num);
left(dst,src,5);
printf("%s\n", dst);
free(dst);
}


我用C试了,没有问题
用的是codeblock
云梦谭 2009-09-11
  • 打赏
  • 举报
回复
此外,新分配的内存块最好用memset先初始化一下。
云梦谭 2009-09-11
  • 打赏
  • 举报
回复
释放应该没问题。越界了吧。检查一下,分配给dst的空间是否足够大?
strcpy是比较危险的,容易溢出,用strncpy,它有长度检查。
kasa_2008 2009-09-11
  • 打赏
  • 举报
回复
dst = NULL ;呢?
「已注销」 2009-09-11
  • 打赏
  • 举报
回复
free(*dst); ??
swallowfyx 2009-09-11
  • 打赏
  • 举报
回复
错误的结果就是,程序一运行就弹出个框:
Debug Error!
...
HEAP CORRUPTION DETECTED:after Normal block(#1083)at 0x00435c00.
CRT detected that the application wrote to memory after end of heap buffer.

编译是通过的就一运行会出这样的错误。

并且把释放内存的语句去掉
//free(dst);
之后就没有任何错误了。
The_facE 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kasa_2008 的回复:]
malloc 用 free去释放

char * dst = (char *)malloc(sizeof(char)*num);  申请了10个

free(dst); 释放1个
[/Quote]

what?那你觉得应该怎么释放?for循环?
james_hw 2009-09-11
  • 打赏
  • 举报
回复
说实话,没看出任何问题。虽然使用的是c++,但是malloc和free的使用方法并没有错。

lz能贴出报错内容不?
kasa_2008 2009-09-11
  • 打赏
  • 举报
回复
malloc 用 free去释放

char * dst = (char *)malloc(sizeof(char)*num); 申请了10个

free(dst); 释放1个
cphj 2009-09-11
  • 打赏
  • 举报
回复
int num = 10 ; 
char * dst = (char *)malloc(sizeof(char)*num);
leftcut(dst,src,5);
cout < <dst < <endl;
free(dst);


这段代码我试过了,没有问题

而且,给char* 分配空间和释放都和调leftcut()、left()无关,因为leftcut()、left()都没有分配额外动态空间和释放已有空间
如果还有错误那么应该在其他地方
w0911h 2009-09-11
  • 打赏
  • 举报
回复
*(q++)='\0'; /*有必要吗?很有必要*/
字符串的结束符,当然有必要
如果如你上面所说用malloc分配的,直接free应该就可以了,报的什么错误?

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧