当前位置:  开发笔记 > 程序员 > 正文

为什么这个scanf会导致分段错误?

如何解决《为什么这个scanf会导致分段错误?》经验,为你挑选了1个好方法。

我正在编写一个程序来计算信息熵,这是熵(H)的函数

H(X)= -sigma(i = 1到n){p(x_i)*log2(p(x_i)}

这里使用base 2 log

然后这是我的计划

#include 
#include 
#include 
#include 

typedef struct vars {
    char *var;
    float prob;
} CHOISES;

float infocont(float x);
float entropy(CHOISES *, int);
void onsig(int);

int main(int argc, char *argv[])
{
    int i = 0;
    int siz = 0;
    float H = 0.0;

    printf("input the number of vars: ");
    scanf("%d", &siz);
    //printf("echo: %d\n", siz);

    CHOISES chs[siz];

    signal(SIGSEGV, onsig);

    for (i = 0; i < siz; i++) {
        printf("%d: ", i + 1);
        scanf("%s %f", chs[i].var, &chs[i].prob); /* HERE IS THE ERROR */
        //printf("echo: %s %f\n", chs[i].var, chs[i].prob);
    }

    H = entropy(chs, siz);

    printf("Entropy is %f\n", H);
}

void onsig(int signo)
{
    fprintf(stderr, "signal caught: %d\nSEGMENTATION FAULT\n", signo);
}

float infocont(float x) 
{
    return (log(1/x) / log(2));
}

float entropy(CHOISES chs[], int len)
{
     short i;
     float entropy;

     for (i = 0; i < len; i++) {
         entropy += chs[i].prob * infocont(chs[i].prob);
     }

     return entropy;
}

我的问题是,当我输入第一个输入并点击输入它会产生分段错误.我使用了调试器,我发现为结构分配数据会导致分段错误.那是执行此代码行的时候

scanf("%s %f", chs[i].var, &chs[i].prob);

发生了分段错误.

但我想不出这段代码中的错误.

为什么scanf()会出现分段错误?



1> Armen Tsirun..:

chs[i].var是一个悬垂的指针.你必须先malloc记住它.

chs[i].var = malloc(Max_str_len + 1);  //<--- this
scanf("%s %f", chs[i].var, &chs[i].prob);


实际上,首先你必须谷歌寻找解决方案如何安全地读取字符串 - 你不知道它有多长.1个字符似乎不太多:-(
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有