以下代码在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);去掉才可以运行。
为什么呀?

解决方案 »

  1.   

    malloc对应的当然需要free了。可能2000多了一些垃圾回收的机制。
      

  2.   

    代码应该没有问题 
    还特地测试了 strncpy(tmp,str+1,l-4); 是 l-4 不是 1-4,呵呵
      

  3.   

    编译是通过了。在运行时出现如上问题。
    是在98下有free(tmp)就出错。只有将free(tmp)去掉,在98下才能正常运行。
      

  4.   

    应该是strncpy多了,你怎么能够保证l-4一定小于5呢?free当然要出错了.
      

  5.   

    应该是int result=atoi(tmp);
       free(tmp);
       return result;
    的问题。
    我怀疑是不是98下atoi返回的地址会和tmp的地址一致(还没有得到证实,你可以在Debug的时候察看一下内存的情况来判断),释放后,自然返回出去的地址内内容不对了。2000多了一些垃圾回收的机制。
      

  6.   

    放到try...catch中去,看抛什么异常出来。
      

  7.   

    int getAddrNum(const char *string)
    {
       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;
    }