malloc 的问题?已有n天拉 没人答 晕!

cat8162 2004-06-21 07:20:19
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>


void main(void)
{
int len;
char a[]={"yhhtes2222"};
char *s1;
char *s2;#include <string.h>
const char *str;

s1=a;

len=strlen(s1);
s2=(char *)malloc(len+1);
printf("%d\n",strlen(s2));
strcpy(s2,s1);
printf("%d,%d,%d\n",strlen(s2),strlen(a),strlen(s1));
printf("%s %d\n",s2,strlen(s2));

free(s2);
//s2=NULL;
exit(0);
}
为什么strlen(s2)总比strlen(a)大四个字节.
在free(s2)的时候,
malloc一定要(len+1)或大于(len+1);
否则回出错??
...全文
187 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
linyd 2004-07-29
  • 打赏
  • 举报
回复
我也是
qwertasdfg123 2004-06-22
  • 打赏
  • 举报
回复
mark
hongfeeling 2004-06-22
  • 打赏
  • 举报
回复
楼上的众位都讲的很清楚了.
cat8162 2004-06-22
  • 打赏
  • 举报
回复
谢谢各位的讲解,
我是在 vc6.0下运行的,

15
10,10,10
yhhtes2222 10

15
10,10,10
yhhtes2222 10

15
10,10,10
yhhtes2222 10

难到我的编译器有问题?
xjp6688 2004-06-21
  • 打赏
  • 举报
回复
strlen在计算字符串长度的时候并未将'\0'计算在内.因此分配内存时需要多分配
palm99 2004-06-21
  • 打赏
  • 举报
回复
如果你的数组在大点,大的数字是不一定的,根据内存里东西而定,如果你把
*(s2+len)="\0",那么就应该一样了。

当然,len+1是以为字符串以“\0”结尾,拷贝的时候自动加的,如果你只是申请了len,那么“\0”就没地方放了,所以出错。
simonwdjp 2004-06-21
  • 打赏
  • 举报
回复
1、我再vc6.0中编译一边你的程序,发现没有大出4个字节,结果很正常
2、s2=(char *)malloc(len+1);这句你也可以写成s2=(char *)malloc(len*sizeof(char));
不过我觉得,你既然知道数组的个数了为什么非要用动态的内存分配呢?当然+1就是加上“\0”结束标志位。两个是等价的,不过建议你写成后者!
junnyfeng(听风)(聪明的傻子):这样做在vc6.0中是可以的返回结果是0也就是一个字符也没有!

astheas 2004-06-21
  • 打赏
  • 举报
回复
不会吧!
我在tc2。0的 版本里
试过了。没有错误哦!
而且改成
len=strlen(s1);
s2=(char *)malloc(len); /***********/
或者 s2=(char *)malloc(len-1);

运行结果都是


0
10,10,10
yhhtes2222 10
0
10,10,10
yhhtes2222 10
0
10,10,10
yhhtes2222 10
0
10,10,10
yhhtes2222 10
0
10,10,10
yhhtes2222 10
junnyfeng 2004-06-21
  • 打赏
  • 举报
回复
s2=(char *)malloc(len+1);
printf("%d\n",strlen(s2)); // 此处不能用strlen去量长度,因为s2还没有字符呢

martmy 2004-06-21
  • 打赏
  • 举报
回复
len=strlen(s1);//strlen在计算字符串长度的时候并未将'\0'计算在内.因此分配内存时需要多分配

70,020

社区成员

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

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