这段代码可以编译但是运行的时候出了问题,求解怎么回事

图片说明

#include "stdio.h"
#include "stdlib.h"
typedef struct
{
    char *ch;
    int length;
}Str;
int strassign(Str& str,char* ch)
{
    if(str.ch)
        free(str.ch);
    int len=0;
    char *c=ch;
    while(*c)
    {
        ++len;
        ++c;
    }
    if (len==0)
    {
        str.ch=NULL;
        str.length=0;
        return 1;
    }
    else
    {
        str.ch=(char*)malloc(sizeof(char)*(len+1));
        if(str.ch=NULL)
            return 0;
        else
        {
            c=ch;
            for(int i=0;i<=len;++i,++c)
                str.ch[i]=*c;
            str.length=len;
            return 1;
        }
    }
}
void main()
{
    Str str;

    strassign(str,"cur");
    printf("helloworld");

}

2个回答

因为你主程序里ch没有 = NULL 初始化,所以这里是随机值,所以if成立,但是显然这里不能free
if(str.ch)
free(str.ch);

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 变量有作用域,一个是str.ch,一个是ch,不一样的,可以区分开。好比我们说商务部,美国商务部,前者是指我国的商务部,这个是可以区分开的。
3 个月之前 回复
bec666
bec666 再问个问题这顿代码中ch为什么没有发生歧义呢,strassign函数中也有ch
3 个月之前 回复

if(str.ch==NULL) 你写为了 if(str.ch=NULL)

#include "stdio.h"
#include "stdlib.h"
typedef struct
{
    char *ch;
    int length;
}Str;
int strassign(Str& str,char* ch)
{
    if(str.ch)
        free(str.ch);
    int len=0;
    char *c=ch;
    while(*c)
    {
        ++len;
        ++c;
    }
    if (len==0)
    {
        str.ch=NULL;
        str.length=0;
        return 1;
    }
    else
    {
        str.ch=(char*)malloc(sizeof(char)*(len+1));
        if(str.ch==NULL)  //这里你把==错写为=了
            return 0;
        else
        {
            c=ch;
            for(int i=0;i<=len;++i,++c)
                str.ch[i]=*c;
            str.length=len;
            return 1;
        }
    }
}
int main()
{
    Str str;
    strassign(str,"cur");
    printf("%s", str.ch);
    return 0;
}
zz00217
空白如空 回复: 你程序出错,主要是我指出的问题,你写错了,你==写为=NULL,后面的str.ch[i]就会空指针
3 个月之前 回复
zz00217
空白如空 回复: 所以第一次调用,并不会free,第二次调用的话,才会free
3 个月之前 回复
zz00217
空白如空 回复bec666: 不是很懂C语言,但我刚刚尝试了第一次调用if(str.ch){printf("test"); free(str.ch); },不会输出test
3 个月之前 回复
bec666
bec666 str.ch=NULL;在主函数后面加了这一句
3 个月之前 回复
bec666
bec666 这个也是一个问题但是楼上老哥说对了还是指针的问题
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

2
在学习vue.js的时候webpack打包,在编译style样式的时候出现了问题,代码如下图
9
萌新求助Android Studio工程编译没问题,运行app就闪退,我试了别的代码,只要修改了xml文件也会闪退。
1
vs编译生成的程序,程序运行比vc生成的程序,运行时间慢
4
Android Studio 是否能够自动编译并且运行APP?
4
写的cpp文件都在同一个工程下,但是编译只能编译有main函数的文件,请问怎样才能一个文件一个文件的运行?
0
关于如何将Python程序交叉编译至Arm运行的问题
2
VS2017+WIN10,程序运行过程中,返回值正确,但是依然会进入错误处理代码块中,求解?
2
【求助大神】编译没问题,运行的时候却闪退,在线等
1
geany下的python 无法编译 求解0 0
1
devc++编译运行的程序出现Error216该如何解决?
1
C++在windos下怎么编译成64位能运行的程序
3
在用VS2010时,为什么这个代码会编译出错?
2
Xcode 10 编译运行报错
2
使用IDEA的时候,每次切换到后台,代码就自动编译,请问怎么关闭呢?
3
eclipse自己写的项目打的的jar包怎么才能看源代码?不用反编译
3
我用idea练习代码,但是编译的时候告诉我没有找到主类,问题出在哪里?
1
C++使用别人的源代码,make编译的时候报未定义的引用
1
单独输出窗口的windows代码 为什么在我的编译器运行 后面还是有控制台
1
code blocks可以编译但是到Linux里的vim时无法编译成功是怎么回事?
2
为什么dev c代码修改以后编译运行仍然运行出原结果?