报错:segment fault (core dumped),请大家看看错误在哪里,单步调试找不到错误啊。

小小白杨123 2014-07-25 03:54:17
执行一次StrAssign()没有问题,如果加上后面虚线包括的那一段代码就报segment fault (core dumped)错误,什么原因啊?
#include <iostream>
#include <stdlib.h>

using namespace std;
//堆分配存储表示

const int ERROR=-1;
const int OK=1;
typedef int Status;

typedef struct {
char *ch; //若是非空串,则按串长分配存储区,否则ch为空
int length; //串长度
}HString;

Status StrAssign(HString &T,char *chars){
if(T.ch) free(T.ch);
int i=0;
char *c=NULL;
for(c=chars;*c!='\0';++c){
++i;
}
if(!i){
T.ch=NULL;
T.length=0;
}else{
T.ch=(char*)malloc(i*sizeof(char));
if(!T.ch) return ERROR;
for(int j=0;j<i;++j){
T.ch[j]=chars[j];
}
T.length=i;
}
return OK;
}

void DisHString(HString s){
cout<<"the string is ";
for(int i=0;i<s.length;++i){
cout<<s.ch[i];
}
cout<<endl<<"and length is "<<s.length<<endl;
}




int main()
{
char c[5]="abcd";
HString s1;
StrAssign(s1,c);
cout<<"s1 is:";
DisHString(s1);

//------------------
char d[6]="hello";
HString s2;
StrAssign(s2,d);
DisHString(s2);
//------------------
return 0;
}
...全文
374 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
whoho 2014-07-26
  • 打赏
  • 举报
回复
这种问题,呵呵,如果单步调试不顶用,就通读代码,把各个分支理顺了就明白了 解决的步骤,在查完crash堆栈后,就可以不管别的,先重读代码是更好的办法 资源分配之前,把一些没初始化的指针先置为NULL有时候能帮你
小小白杨123 2014-07-25
  • 打赏
  • 举报
回复
引用 4 楼 Idle_ 的回复:
[quote=引用 楼主 littlebeat123 的回复:] 执行一次StrAssign()没有问题,如果加上后面虚线包括的那一段代码就报segment fault (core dumped)错误,什么原因啊?
#include <iostream>
#include <stdlib.h>

using namespace std;
//堆分配存储表示

const int ERROR=-1;
const int OK=1;
typedef int Status;

typedef struct {
    char *ch; //若是非空串,则按串长分配存储区,否则ch为空
    int length; //串长度
}HString;

Status StrAssign(HString &T,char *chars){
    if(T.ch) free(T.ch);
    int i=0;
    char *c=NULL;
    for(c=chars;*c!='\0';++c){
        ++i;
    }
    if(!i){
        T.ch=NULL;
        T.length=0;
    }else{
        T.ch=(char*)malloc(i*sizeof(char));
        if(!T.ch) return ERROR;
        for(int j=0;j<i;++j){
            T.ch[j]=chars[j];
        }
        T.length=i;
    }
    return OK;
}

void DisHString(HString s){
    cout<<"the string is ";
    for(int i=0;i<s.length;++i){
        cout<<s.ch[i];
    }
    cout<<endl<<"and length is "<<s.length<<endl;
}




int main()
{
    char c[5]="abcd";
    HString s1;
    StrAssign(s1,c);
    cout<<"s1 is:";
    DisHString(s1);

    //------------------
    char d[6]="hello";
    HString s2;
    StrAssign(s2,d); <<--这里设断点,然后查看s2, 你会发觉s2.ch不等于NULL
    DisHString(s2);
    //------------------
    return 0;
}
[/quote] 我在struct 里写了一个默认构造函数,把ch默认置空就解决了。谢谢你。
阿呆_ 2014-07-25
  • 打赏
  • 举报
回复
引用 楼主 littlebeat123 的回复:
执行一次StrAssign()没有问题,如果加上后面虚线包括的那一段代码就报segment fault (core dumped)错误,什么原因啊?
#include <iostream>
#include <stdlib.h>

using namespace std;
//堆分配存储表示

const int ERROR=-1;
const int OK=1;
typedef int Status;

typedef struct {
    char *ch; //若是非空串,则按串长分配存储区,否则ch为空
    int length; //串长度
}HString;

Status StrAssign(HString &T,char *chars){
    if(T.ch) free(T.ch);
    int i=0;
    char *c=NULL;
    for(c=chars;*c!='\0';++c){
        ++i;
    }
    if(!i){
        T.ch=NULL;
        T.length=0;
    }else{
        T.ch=(char*)malloc(i*sizeof(char));
        if(!T.ch) return ERROR;
        for(int j=0;j<i;++j){
            T.ch[j]=chars[j];
        }
        T.length=i;
    }
    return OK;
}

void DisHString(HString s){
    cout<<"the string is ";
    for(int i=0;i<s.length;++i){
        cout<<s.ch[i];
    }
    cout<<endl<<"and length is "<<s.length<<endl;
}




int main()
{
    char c[5]="abcd";
    HString s1;
    StrAssign(s1,c);
    cout<<"s1 is:";
    DisHString(s1);

    //------------------
    char d[6]="hello";
    HString s2;
    StrAssign(s2,d); <<--这里设断点,然后查看s2, 你会发觉s2.ch不等于NULL
    DisHString(s2);
    //------------------
    return 0;
}
小小白杨123 2014-07-25
  • 打赏
  • 举报
回复
引用 1 楼 autumn1202 的回复:
局部变量,木得赋初值,初始值应该是不确定值, 所以s2的StrAssign走到了17行free(T.ch),导致段错误
额,不太明白...能详细讲讲吗?
Saleayas 2014-07-25
  • 打赏
  • 举报
回复
HString s1 = { };
autumn1202 2014-07-25
  • 打赏
  • 举报
回复
局部变量,木得赋初值,初始值应该是不确定值, 所以s2的StrAssign走到了17行free(T.ch),导致段错误

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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