标题:free(s)出现的这个错误时什么情况?
只看楼主
yellowcat
Rank: 2
等 级:论坛游民
帖 子:10
专家分:13
注 册:2011-1-25
结帖率:100%
已结贴  问题点数:20 回复次数:5 
free(s)出现的这个错误时什么情况?

RT,做书上的练习,strcat(s,t,n)的时候(n的意思是只对第二个字符串前n位做处理),如果第二个字符串过长(短一点没有任何问题),比如图上的123个字符,能正常的把第二个字符串贴到第一个后面,但是之后执行到free(s)的时候就会弹出这个错误(点忽略的话程序继续正常运行下去,应该不是啥致命错误,只是个警告,说的好像是程序在堆缓冲区的末尾后面写入了什么玩意),有没人高人能解释下这其中的原理啊。
(删掉free(s)就没警告了)
还有就是在VC2008编译器里面debug执行也没有问题。就是cmd才有问题
对了,我的s指针的空间是realloc动态分配的,s+t有多少字符,它就有s+t+1这么多。

[ 本帖最后由 yellowcat 于 2011-1-28 17:39 编辑 ]
搜索更多相关主题的帖子: 字符串 缓冲区 编译器 没有问题 
2011-01-28 17:38
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
S指针是realloc动态分配的?为什么要用这个函数呢?
把你的程序代码贴出来,有人会帮你找到更多的问题。

我们都在路上。。。。。
2011-01-28 17:48
yellowcat
Rank: 2
等 级:论坛游民
帖 子:10
专家分:13
注 册:2011-1-25
得分:0 
以下是引用hellovfp在2011-1-28 17:48:03的发言:

S指针是realloc动态分配的?为什么要用这个函数呢?
把你的程序代码贴出来,有人会帮你找到更多的问题。

不这样的话就只有给把S做成数组,给个长一些的范围,比如说S[100],S[1000],感觉不怎么爽,
所以strcat的时候就用了动态,本来还写了一个在函数里面分配的,不过那样的话参数就要写成my_strcat(&s,t,n),题目上要求的形式是strcat(s,t,n).所以就勉强一下了,反正是自己用的
程序代码:
#include <stdio.h>
#include <stdlib.h> 

int my_strcat();
int my_strcpy();
int my_strcmp();
void main()
{    int i=1,j,n,c;
    char *s;
    char *t;

 while(i){
    fflush(stdin); //清除输入缓冲区,为getchar()扫除障碍。
    printf("请输入第一个字符串:\n");
    for(i=0,s=(char*)malloc(sizeof(char));(*(s+i)=getchar())!='\n';i++)
        s=(char*)realloc(s,(i+2)*sizeof(char));
    *(s+i)='\0';
    printf("请输入第二个字符串:\n");
    for(j=0,t=(char*)malloc(sizeof(char));(*(t+j)=getchar())!='\n';j++)
        t=(char*)realloc(t,(j+2)*sizeof(char));
    *(t+j)='\0';
    printf("请输入n:\n");
    scanf("%d",&n);
    printf("请输入相应的值(1、2、3)选择需要进行的测试:\n");
    printf("1、strcpy\n");
    printf("2、strcat\n");
    printf("3、strcmp\n");
    scanf("%d",&c);
    switch(c)
    {
    case 1:
        if(my_strcpy(s,t,n)==0) printf("需处理的第二个字符串部分不能比第一个字符串长\n");
        printf("结果为:%s\n",s);
        break;
    case 2:
        s=(char*)realloc(s,(i+j+1)*sizeof(char));//给第二个字符串的加入增加空间
        my_strcat(s,t,n);
        printf("结果为:%s\n",s);
        break;
    case 3:
        printf("结果为:%d\n",my_strcmp(s,t,n));
        break;
    }
    free(s);
    free(t);
    printf("继续测试请输入1\n");
    printf("退出请输入0\n");
    scanf("%d",&i);

 }

}
int my_strcat(char *s,char *t,int n)  
{   
    int i,j,k;
    for(i=0;*(s+i)!='\0';i++);
    for(j=0;*(t+j)!='\0'&&j<n-1;j++);
    for(k=0;k<=j;k++)
    {
        *(s+i++)=*(t+k);
    }
    *(s+i)='\0';

};
int my_strcpy(char *s,char *t,int n)
{
    int i=0,j=0;
    while(*(s+i)!='\0') i++;
    while(j<n&&((*(t+j))!='\0')) j++;
    if(n>i) return 0;
    for(i=0;i<j;i++)
    {
       *(s+i)=*(t+i);
    }
    *(s+i)='\0';
    return 1;

};
int my_strcmp(char *s,char *t,int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        if(*(s+i)-*(t+i)!=0)
            return (int)(*(s+i)-*(t+i));
    }
    if(*(s+i)=='\0')
        return 0;
    else return (int)(*(s+i));

};


[ 本帖最后由 yellowcat 于 2011-1-28 17:55 编辑 ]
2011-01-28 17:53
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
得分:0 
    for(i=0,s=(char*)malloc(sizeof(char));(*(s+i)=getchar())!='\n';i++)
   {
        s=(char*)realloc(s,(i+2)*sizeof(char));
       if(s==NULL)  //在这些地方加上这些看一看出了什么问题
       {
        //还没有正常分配
       }
  }
建意:将程序全部语句省略,除了输入(包括你增长数组)与输出,看一看是不是输入的地方出了问题,还是什么,然后适当加上代码,再看一看那个地方出问题。

小代码,大智慧
2011-01-28 20:13
cacker
该用户已被删除
得分:20 
提示: 作者被禁止或删除 内容自动屏蔽
2011-01-29 01:31
yellowcat
Rank: 2
等 级:论坛游民
帖 子:10
专家分:13
注 册:2011-1-25
得分:0 
以下是引用cacker在2011-1-29 01:31:24的发言:

这个错误信息  楼主检查一下是否是数组越界了  你把他的标志给改了    在debug模式下

他会在你申请的堆内存前4个字节初始化为0xFDFDFDFD  末尾后4个字节也是这样


如果不是这个问题,那就检查一下是否重复释放   好像就这两问题吧

应该是你说的这个问题了,试了一下,release的没这个问题
2011-01-29 10:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-331688-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.102689 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved