以下代码在2000下正常运行
int getAddrNum(const char *string)
{
char *str;
str=strchr(string,',');
int l=strlen(str);
char *tmp=(char*)malloc(sizeof(char)*5);
strncpy(tmp,str+1,l-4);
int result=atoi(tmp);
free(tmp);
return result;
}
而在98下需要将 free(tmp);去掉才可以运行。
为什么呀?
int getAddrNum(const char *string)
{
char *str;
str=strchr(string,',');
int l=strlen(str);
char *tmp=(char*)malloc(sizeof(char)*5);
strncpy(tmp,str+1,l-4);
int result=atoi(tmp);
free(tmp);
return result;
}
而在98下需要将 free(tmp);去掉才可以运行。
为什么呀?
还特地测试了 strncpy(tmp,str+1,l-4); 是 l-4 不是 1-4,呵呵
是在98下有free(tmp)就出错。只有将free(tmp)去掉,在98下才能正常运行。
free(tmp);
return result;
的问题。
我怀疑是不是98下atoi返回的地址会和tmp的地址一致(还没有得到证实,你可以在Debug的时候察看一下内存的情况来判断),释放后,自然返回出去的地址内内容不对了。2000多了一些垃圾回收的机制。
{
char *str;
str=strchr(string,',');
int l=strlen(str);
char *tmp=(char*)malloc(sizeof(char)*5);//这里tmp指向的内存没有初始化为0
//应该加上下面一句
//memset(tmp, 0, sizeof(char)*5)
strncpy(tmp,str+1,l-4);//复制l-4个字节到tmp中,你能保证tmp中有效文本后一定有个结尾的0吗?另外,l-4会不会大于sizeof(char)*5?即是否越界??
int result=atoi(tmp);//如果temp不是以0结尾的,这里就会错的
free(tmp);
return result;
}