【求助】结构体内部指针无法释放?

Crazy_hand 2011-02-12 06:05:37

typedef long strsizeT;
typedef char* pChar;

typedef struct cString {
pChar str;
strsizeT Len;
}cString;

/* 初始化一个cString类变量 */
cString Init( )
{
cString tmp;

tmp.str = NULL;
tmp.Len = 0;

return tmp;
}

/*
构造一个字符串结构体
接受一个常量字符串 或是 一个 char *类型的的变量返回一个cString类型
( 如果str为空字符串,将返回一个空的cString )

当返回的cStringName.LengthSF()的长度为 Error 时,为创建错误
*/
cString GreateStr( const pChar str )
{
cString tmp;
strsizeT strSize = __SizeS( str );

if( strSize == 0 )
return Init();
else if( !(tmp.str = (pChar) malloc( strSize ) ) )
{
tmp.Len = Error;
return tmp;
}
else
{
strncpy( tmp.str, str, strSize );
tmp.str[ strSize ] = '\0';
tmp.Len = strSize;
}

return tmp;
}

/*
销毁一个字符串,
DestoryStr函数只销毁由GreateStr()创建的cString 类型的数据
*/
void DestroyStr( cString *s )
{
s->Len = 0;
free( s->str );
s->str = NULL;
}

int main(void)
{
cString test = Init();

test = GreateStr( "This is a test of cString Type!" );
printf( "%s\n", test.str );

DestroyStr( &test );
/* 释放函数在执行 free( test->str); 这句的时候就不往下走了,我单步跟进的时候是停在了一句汇编语言上.
另外,没有任何的错误信息提示。编译器为vs10. */
}

...全文
144 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
至善者善之敌 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 brookmill 的回复:]
else if( !(tmp.str = (pChar) malloc( strSize ) ) )
......
tmp.str[ strSize ] = '\0';
这是明显的越界。
比如strSize=5吧,给分配了5个字节,那就只能用str[0]到str[4],str[5]就越界了
[/Quote]

+++++++
Crazy_hand 2011-02-12
  • 打赏
  • 举报
回复
太感谢了。

之前也考虑过越界问题,但不知道 “用malloc分配了内存,越界写的时候不出错,free的时候出错,他就是这么怪。"这个特性=_=。 一直以为它应该报错的。

brookmill 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 crazy_hand 的回复:]
/* 释放函数在执行 free( test->str); 这句的时候就不往下走了,我单步跟进的时候是停在了一句汇编语言上.
另外,没有任何的错误信息提示。编译器为vs10. */
[/Quote]
用malloc分配了内存,越界写的时候不出错,free的时候出错,他就是这么怪。
试试这样,看看在哪里出错。
char *p = (char*)malloc(1);
p[10]='0'; // 这个10可能要调整一下
free(p);
brookmill 2011-02-12
  • 打赏
  • 举报
回复
else if( !(tmp.str = (pChar) malloc( strSize ) ) )
......
tmp.str[ strSize ] = '\0';
这是明显的越界。
比如strSize=5吧,给分配了5个字节,那就只能用str[0]到str[4],str[5]就越界了
brookmill 2011-02-12
  • 打赏
  • 举报
回复
多分配一个字节试试
else if( !(tmp.str = (pChar) malloc( strSize +1 ) ) )
Crazy_hand 2011-02-12
  • 打赏
  • 举报
回复
之前查过书《 c Primer plus 》。
我和书上的实现步骤是一样的啊。 14.7.7 p395

69,371

社区成员

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

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